在項目中,我定義的存儲過程以下示例代碼:SQL注入實體框架Database.SqlQuery
CREATE PROCEDURE [dbo].[Stored]
@ParameterA AS varchar(128),
@ParameterB AS varchar(128),
@ParameterC AS varchar(400)
AS
BEGIN
DECLARE @query AS Varchar(MAX)
SET @query = 'SELECT *
FROM Table
WHERE A = '''+ @ParameterA + ''
IF @ParameterB = 'B'
BEGIN
SET @query = @query + ' AND C=''' + @ParameterC + ''
END
EXECUTE sp_executesql @query
END
我打電話實體框架此過程中通過下面的代碼:
DBContext.Database.SqlQuery<Object>("Stored",
new SqlParameter("@p0", Param0),
new SqlParameter("@p1", Param1),
new SqlParameter("@p2", Param2)).ToList();
如果我把下面的字符串存儲過程,我產生一個SQL注入:
Param2 = "ABC' ; DROP TABLE Table2"
我如何使用實體框架來防止這種情況?
我建議你避免在SQL語句的字符串連接的所有形式,甚至在存儲過程中。另外,您可以通過過濾單詞來對輸入進行清理,以便在執行查詢之前在EF端刪除這些SQL關鍵字。 –
可能[相關](https://stackoverflow.com/a/15941731/1154184) – Reyno
我認爲你不能阻止EF本身的這種事情。我會考慮查看更大的圖片https://msdn.microsoft.com/zh-cn/library/cc716760(v=vs.110).aspx – Edgaras