[英]SQL injection with Entity Framework 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
我通過以下代碼使用Entity Framework調用此過程:
DBContext.Database.SqlQuery<Object>("Stored",
new SqlParameter("@p0", Param0),
new SqlParameter("@p1", Param1),
new SqlParameter("@p2", Param2)).ToList();
如果我用下面的字符串調用存儲過程,我生成一個SQL注入:
Param2 = "ABC' ; DROP TABLE Table2"
如何使用Entity Framework阻止這種情況?
Microsoft提供了一些規則,以避免/最小化SQL注入的風險: https : //docs.microsoft.com/en-us/sql/relational-databases/security/sql-injection
例如:
“永遠不要直接從用戶輸入構建Transact-SQL語句。”
這意味着在這種情況下我將使用參數化的sp_executesql
重寫原始代碼:
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 = @prmA'
IF @ParameterB = 'B'
BEGIN
SET @query = @query + ' AND C=@prmC'
END
EXECUTE sp_executesql @query, N'@prmA VARCHAR(128), @prmC VARCHAR(128)', @prmA = @ParameterA, @prmC = @ParameterC
END
sp_executesql的參考: https : //docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql
底層的SQL過程是錯誤的,也是安全的噩夢。 你無法在它上面的層上修復它。 你在EntityFramework中盡你所能,但它仍然不安全。 您需要修復問題(SQL proc),而不是使用它將帶輔助應用於圖層。
sp_executesql似乎是需要具有動態SQL和綁定參數的過程的良好起點。
您正在創建一個動態查詢,您在其中連接參數。 這引起了問題。
不要使用動態查詢或驗證參數(如果它包含任何關鍵字或字符)
您還可以根據參數將查詢重寫為IF-ELSE結構,因此您不需要動態查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.