簡體   English   中英

動態創建表時如何避免SQL注入風險?

[英]How to avoid SQL injection risk when creating table dynamically?

這是從用戶提供的輸入創建表的簡單過程:

PROCEDURE `hackProcedure`(
IN tab_name VARCHAR(63))
BEGIN

IF (tab_name REGEXP '^[A-Za-z0-9 ]+$')
THEN
    SET @StB = CONCAT('CREATE TABLE tab_name
                      (id INT(10) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
                      name VARCHAR(45),
                      guid VARCHAR(36));');
    PREPARE statementB FROM @StB;
    EXECUTE statementB;
    DEALLOCATE PREPARE statementB;
ELSE
    -- SIGNAL some error;
END IF;
#END

在創建表之前,我檢查用戶輸入是否僅包含字母數字值,因此據我所知,嘗試對此過程進行SQL注入的壞人無法成功,因為無法注釋掉其余查詢或添加其他列。 這是安全的還是我缺少東西?

它不容易受到攻擊,因為您顯示給我們的代碼對表名使用文字值-而不是參數。 我認為您想這樣做:

CONCAT('CREATE TABLE ',  tab_name, '
                  (id INT(10) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
                  name VARCHAR(45),
                  guid VARCHAR(36));');

現在,如果我用...調用函數呢?

dummy (id INT NOT NULL); DROP TABLE mysql.users; CREATE TABLE dummy2

由於分號和方括號將被正則表達式拒絕,因此它將失敗,但這遠不是一個可靠的解決方案。

在表名周圍添加反引號(只要正則表達式不允許),這是一個小改進。

 CONCAT('CREATE TABLE `',  tab_name, '`

暫無
暫無

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

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