如果在C#中对字符串进行插值,如何在接受字符串的方法内部进行检查?

问题描述 投票:0回答:1

如果字符串是用C#内插的,如何检查包含字符串的方法内部?

我看到EF有能力执行此here

// String interpolation
var author = db.Authors.FromSql($"SELECT * From Authors Where AuthorId = {id}").FirstOrDefault();

Entity Framework Core仅在将内插字符串内联提供给FromSql方法调用时才对内插字符串进行参数化。在FromSql方法调用外部声明的插值字符串将不会解析为参数占位符。实际上,您将直接将连接的字符串传递到数据库,这是SQL注入的风险。

以下示例是危险的,不应使用:

var sql = $"SELECT * From Authors Where AuthorId = {id}";
var author = db.Authors.FromSql(sql).FirstOrDefault(); 

在阅读上面的摘录之前,我认为在方法内部我会得到一个字符串,并且不可能知道它是如何构造的。摘录使我相信这是有可能的。

c# entity-framework parameters arguments interpolation
1个回答
5
投票

内插字符串文字可以具有stringFormattableString的类型,这取决于类型推断。

EF使用FormattableString作为FormattableString的参数类型,因此它既可以使用FromSql属性获取格式,又可以使用FormatGetArguments方法获取参数。

这里有一些代码演示了此类的基本用法。

GetArgument

因此,从本质上讲,var arg1 = 10; var arg2 = 20; FormattableString fs = $"Arg1 is {arg1} and Arg2 is {arg2}."; Console.WriteLine(fs.Format); Console.WriteLine(fs.GetArgument(0)); Console.WriteLine(fs.GetArgument(1)); // output: Arg1 is {0} and Arg2 is {1}. 10 20 允许EF防止SQL注入,因为它“不立即格式化字符串”,而是将格式化字符串包装到一个不错的小对象中,以便EF进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.