如果字符串是在 C# 中插入的,如何检查接受字符串的方法内部?

qqq*_*qqq 3 c# parameters interpolation arguments entity-framework

如果字符串是在 C# 中插入的,如何检查接受字符串的方法内部?

我看到 EF 有能力在这里做到这一点

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

如果内联提供给 FromSql 方法调用,Entity Framework Core 只会参数化内插字符串。在 FromSql 方法调用之外声明的内插字符串将不会被解析为参数占位符。实际上,您将直接将串联字符串传递给数据库,这存在 SQL 注入风险。

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

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

在阅读上面的摘录之前,我认为在一个方法中我得到了一个字符串并且不可能知道它是如何构造的。摘录让我相信这在某种程度上是可能的。

Swe*_*per 5

内插字符串文字的类型可以是string, 或FormattableString,这由类型推断确定。

EF 使用 aFormattableString作为 的参数类型FromSql,因此它既可以使用Format属性获取格式,也可以使用GetArgumentsGetArgument方法获取参数。

下面是一些演示此类基本用法的代码。

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
Run Code Online (Sandbox Code Playgroud)

所以本质上,FormttableString允许 EF 防止 SQL 注入,因为它“不会立即格式化字符串”,而是将格式字符串包装成一个漂亮的小对象,供 EF 操作。