簡體   English   中英

如果使用准備好的語句,這個 MySQL 存儲過程是否仍然存在 SQL 注入的風險?

[英]Is this MySQL stored procedure still at risk of SQL injection if it uses prepared statements?

我對 MySQL 還很陌生,我已經盡可能多地搜索了,但我希望有人能給我一個明確的答案。

我一直在查看 MySQL 數據庫中存儲過程的問題。 它將來自外部源的單個字符串參數作為搜索值,並基於此返回結果。 但是,只要鍵入 '(單引號/撇號),它就會返回錯誤。 調查后,我被告知 SP 很容易受到 SQL 注入的影響,並且通過解決單引號問題將得到解決。 這是存儲過程:

BEGIN
SET @t1=CONCAT("SELECT `ID` as `Id`, `NAME` as `Name` FROM SEARCH_TABLE WHERE `NAME` like","'",searchString,"%'"," LIMIT 20");
    PREPARE stmt3 FROM @t1;
    EXECUTE stmt3;
    DEALLOCATE PREPARE stmt3;
END

我所看到的一切都表明,避免 SQL 注入的最佳方法是使用准備好的語句,那么它仍然存在風險嗎? 此外,為了解決單引號的問題,我已經看到建議在輸入的任何位置添加另一個單引號(因此 ' 將變為 '')。 這是修復錯誤的最佳方法嗎?

謝謝您的幫助

當您使用准備好的語句時,您沒有使用位置占位符? 對於您的陳述的可變部分。 因此,您編寫的 select 查詢仍然容易出現 SQL 注入。 這是一個更新的版本:

BEGIN
SET @t1 = CONCAT('SELECT ID AS Id, NAME AS Name, FROM SEARCH_TABLE WHERE NAME LIKE ? LIMIT 20');
PREPARE stmt1 FROM @t1;
SET @a = CONCAT('%', searchString, '%');  -- assuming searchString is defined somewhere
EXECUTE stmt1 USING @a;

我們使用CONCAT() function 綁定%?% ,並注意到LIKE占位符只是一個? . 此外,假設您的查詢使用LIMIT ,理想情況下應該有一個ORDER BY子句。

是的,您的代碼對 SQL 注入開放,因為准備好的語句將用戶提供的輸入按原樣連接在一起。 假設searchString包含字符串' OR '%' = '那么這個:

SET @t1=CONCAT("SELECT `ID` as `Id`, `NAME` as `Name` FROM SEARCH_TABLE WHERE `NAME` like","'",searchString,"%'"," LIMIT 20");

會導致:

SELECT `ID` as `Id`, `NAME` as `Name` FROM SEARCH_TABLE WHERE `NAME` like'' OR '%' = '%' LIMIT 20

它將允許某人通過任意 where 子句。 此外,用戶輸入中的單個'將中斷查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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