[英]Is this MySQL Stored Procedure vulnerable to SQL injection?
我有一個使用動態SQL的MySQL存儲過程。 之所以使用動態SQL,是因為我們有幾個表具有相似的列,並且試圖使代碼盡可能地可重用。
我擔心SQL注入,但是標准的攻擊字符串似乎對此不起作用。 此存儲過程是否容易受到SQL注入的影響? 如果是這樣,是否有更好的編寫方法?
CREATE DEFINER=CURRENT_USER PROCEDURE `sp_lookup`(IN tableName VARCHAR(256))
BEGIN
SET @sql = CONCAT('SELECT id, name, FROM ', tableName, ' ORDER BY name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
END
存儲過程不會增加任何其他安全性。
它不會阻止SQL注入,您需要使用准備好的語句。
另一種方法是使用表白名單,這意味着您首先檢查該表是否與現有表之一匹配,如果不運行查詢的話。
僅當將用戶提供的文本字符串連接到SQL語句而沒有適當的轉義時,才發生SQL注入。 由於您的表名將不會由用戶提供,而是由程序員提供,因此您不會遇到麻煩。
但是,您不應這樣做。 數據庫引擎最好具有顯式語句,以便可以正確優化它們,而不必在每次調用時都重新解析SQL。
表名應該用“滴答”括起來,並且所有滴答都應轉義,如下所示:
CREATE DEFINER=CURRENT_USER PROCEDURE `sp_lookup`(IN tableName VARCHAR(256))
BEGIN
SET @sql = CONCAT('SELECT id, name FROM `', REPLACE(tableName, '`', '\`'), '` ORDER BY name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
END
盡管目前缺少這些功能,但看來您的脆弱性相當低; 根據官方文檔 “准備好的語句的SQL語法不支持多語句”
孤立地說,是的,此存儲的proc可能是易受攻擊的,但該漏洞可能無關緊要。 什么事情做的是與否的價值tablename
參數來自可信來源的到來。
如果您檢查“標准攻擊字符串”之一,則會看到攻擊者正在嘗試完成SQL查詢,然后再進行另一個查詢。 為此,攻擊者必須能夠直接修改正在拼接到您的查詢中的字符串。
如果使用此SP的方式使敵對用戶無法直接修改tablename
的值,則您沒有SQL注入漏洞。
我希望這是有道理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.