簡體   English   中英

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

[英]How is it possible to check inside a method which accepts a String if the string was interpolated in C#?

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

我看到 EF 有能力在這里做到這一點

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

如果內聯提供給 FromSql 方法調用,Entity Framework Core 只會參數化內插字符串。 在 FromSql 方法調用之外聲明的內插字符串不會被解析為參數占位符。 實際上,您將直接將串聯字符串傳遞給數據庫,這存在 SQL 注入風險。

以下示例是危險的,不應使用:

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

在閱讀上面的摘錄之前,我認為在一個方法中我得到了一個字符串並且不可能知道它是如何構造的。 摘錄讓我相信這在某種程度上是可能的。

內插字符串文字可以具有stringFormattableString類型,這由類型推斷確定。

EF使用FormattableString作為參數類型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

所以本質上, FormttableString允許 EF 防止 SQL 注入,因為它“不會立即格式化字符串”,而是將格式字符串包裝成一個漂亮的小對象,供 EF 操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM