簡體   English   中英

該MySQL存儲過程是否容易受到SQL注入的攻擊?

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

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