簡體   English   中英

使用SQL注入的存儲過程

[英]Stored Procedure with SQL Injection

我想創建一個將ID作為輸入的存儲過程,並且根據ID的列表將相應地執行操作。

例:

DROP PROCEDURE IF EXISTS sp_G;
DELIMITER ;;
CREATE PROCEDURE sp_G (
    IN  IDs VARCHAR(20) -- Example: '1, 2, 3'
    )
BEGIN
    SET @Query='SELECT * FROM table_users as t';

    IF IDs!=NULL
    THEN
        SET @Query=CONCAT(@Query, ' WHERE t.ID in(', IDs, ')'); -- SQL Injection problem
    END IF;

    PREPARE stmt FROM @Query;
    EXECUTE stmt;

END ;;
DELIMITER ;

碰巧我在'CONCAT'中進行了SQL注入,因為我不能按照以下鏈接所示使用' EXECUTE stmt USING'IDhttp : //dev.mysql.com/doc/refman/5.7/ zh / sql-syntax-prepared-statements.html

由於IDs參數是可選的,因此僅當非NULL時,它將影響查詢。 但是,根據文檔,我們假定此ID參數將始終存在。 如果IDs參數具有SQL注入,將被執行。 有人能幫我嗎? 提前致謝。

您可以使用正則表達式匹配來檢查參數是否僅包含允許的字符。

IF IDs IS NOT NULL AND IDs RLIKE '^[0-9, ]+$'
THEN
    SET @Query=CONCAT(@Query, ' WHERE t.ID in(', IDs, ')');
END IF

這適用於簡單的參數,例如ID列表。 但是,它不能推廣到更復雜的情況。 最好的解決方案是設計您的應用程序,這樣一來,您就無需在一開始就將用戶提供的輸入替換為查詢。

例如,調用程序可以將信息放在臨時表中,而不是使用逗號分隔的值列表進行匹配的過程。 然后查詢將是

SELECT u.* FROM table_users AS u
JOIN temp_table AS t ON u.id = t.id

暫無
暫無

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

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