Entity Framework中的字符串插值引发担忧
將內插字符串(Interpolated Strings)自動地轉化為參數化SQL語句,這是Entity Framework Core 2提供的一個新特性。雖然該特性從設計上是為了避免出現SQL語句編寫上的問題,但是有人擔心這會導致更多的SQL注入攻擊。
下面給出一個正確工作的字符串插值例子:
var city = "Redmond"; context.Customers.FromSql($"SELECT * FROM Customers WHERE City = {city}"); SELECT * FROM Customers WHERE City = @p0a我們對此稍作更改,下面的代碼就不工作了:
var city = "Redmond"; var sql = $"SELECT * FROM Customers WHERE City = {city}"; context.Customers.FromSql(sql); SELECT * FROM Customers WHERE City = Redmond這是因為后者將表達式存儲在本地變量中,這一簡單操作完全地更改了代碼的行為。
為推本溯源,我們需要理解C#中“$"”表達式的事實真實行為。乍一看,表達式僅是將內插字符串轉換為一個正常的String.Format調用。但事實上,它還做了一些額外的工作。
本質上,“$"”表達式是FormattableString的一個子類。對象中包含字符串格式化表達式以及所有需要填充的值。對象在傳遞給EF Core的FromSql(FormattableString)方法后,會執行必要的替換,并得到了參數化的SQL表達式。
問題在于,編譯器并不愿意直接操作FormattableString。除非我們將“$"”表達式直接指定為一個FormattableString類型的變量或參數,否則表達式將立刻被轉換為字符串。在正常情況下,這是一種良性更改,因為我們希望最終能給出字符串格式。
不幸的是,在EF Core中,會丟失全部有意義的信息,Entity Framework使用這些信息對SQL語句參數化。此外一旦發生錯誤,EF Core并不會給出任何編譯器告警或是其它的指示信息。因此如果開發人員試圖“清理”代碼,這類軟件缺陷就很容易混入到應用中。
如要深入了解EF Core使用字符串插值可導致SQL注入攻擊這一問題,可從GitHub下載Nick Craver給出的“EFCoreInjectionSample”例子代碼,也可以看一下他發布在ASP.NET Monster上的一個幻燈片,名為“EF Core 2.0中的SQL注入攻擊”(SQL Injection attacks in Entity Framework Core 2.0)。
原文地址:http://www.infoq.com/cn/news/2017/09/EF-Core-2.0-4
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的Entity Framework中的字符串插值引发担忧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 运行原理剖析
- 下一篇: spring cloud+dotnet