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