2013-04-08 59 views
6

這些函數可以訪問SQL中的專用函數(SqlClient)。例如「喜歡」或「之間」。而且他們也爲他們提供了一個更好的通用抽象層。不要與存儲過程「功能」混淆,這是其他question的主題。實體框架的SQL運算符函數是否可以防範SQL注入?

我的問題,我似乎無法找到一個完整的答案是。他們是否安全使用,或者我打開系統到SQL injection attack?編寫常規SqlCommands時,我總是使用綁定變量。

但是轉向實體框架。對SQL語句的控制較少。我不介意,但當我連接來自瀏覽器的字符串並將其傳遞給函數時,我不禁擔心。

下面是一個例子:

var QueryResult = EFContext.Table.Where(x => 
    SqlFunctions.PatIndex("%" + Potentially_unsafe_search_keyword + "%", 
          x.Column) > 0); 

我做了一些測試,並追蹤發送到服務器的實際SQL。單引號會自動跳出。很明顯,那裏有一些保護。有一些消毒正在發生。插入語句確實使用綁定變量。我應該滿意單引號替換嗎?幕後有其他事情嗎?

+0

測試它。分析您的數據庫以找出究竟生成了什麼SQL。 – 2013-04-08 21:07:53

+0

@ marvc1我做過了,這就是我發現單個qoutes被轉化爲雙引號的原因。但我不是SQL注入專家,這真的很棒嗎? – 2013-04-08 21:10:22

+0

嘗試行'x'; DROP TABLE tableName; --'看看這個表是否被丟棄。先替換表名。 – 2013-04-08 21:13:08

回答

3

Linq中的每個常量變量參數都作爲IDbCommand中的命令參數傳遞,而IDbCommand中的參數又被底層驅動程序轉義。

除非存在錯誤,否則所有EF查詢和SQL幫助函數都可以安全地防範SQL注入攻擊。

相關問題