如果字符串是用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();
在阅读上面的摘录之前,我认为在方法内部我会得到一个字符串,并且不可能知道它是如何构造的。摘录使我相信这是有可能的。
内插字符串文字可以具有string
或FormattableString
的类型,这取决于类型推断。
EF使用FormattableString
作为FormattableString
的参数类型,因此它既可以使用FromSql
属性获取格式,又可以使用Format
和GetArguments
方法获取参数。
这里有一些代码演示了此类的基本用法。
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进行操作。