2016-04-29 33 views
0
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE " + aColumn + " = '" + passedInValue + "'"); 

// normally when using parameters I would do something like this: 
var valueParam = SqlParameter("aValue", passedInValues); 
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE Column1 = @aValue", valueParam); 
// NOTE: I would not do this at all. I know to use LINQ. But for this question, I'm concentrating on the issue of passing variables to a raw sql string. 

但因爲這兩個列和值是「參數」中:使原始的SQL安全實體框架

var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE " + aColumn + " = '" + passedInValue + "'"); 

,有防止SQL注入兩個?

回答

1

第一:whilelist aColumn:必須通過字符串連接添加,但您知道數據庫中有哪些列(或者您可以使用模式視圖進行檢查)。

第二:在實體框架中 - 如您所示 - 您可以在查詢中使用參數值。但是,不是創建SqlParameter實例,而是可以傳遞值並使用@p0@p1,...。

+0

你能對你的解答的第一部分擴大? 'whilelist'aColumn'是什麼意思? –

+0

@DaBest Whitelist列:如果'aColumn'在已知列的列表中不完全匹配,則失敗:'if(!safeColumList.Contains(aColumn))throw new SecurityException(「Hacker !!」);'。 – Richard