簡體   English   中英

SQL注入實體框架Database.SqlQuery

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM