日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Entity Framework中的字符串插值引发担忧

發布時間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的字符串插值引发担忧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。