在MySQL中是一個在SQL注入安全的存儲過程中的預備語句?見下面的例子。 get_info存儲過程傳遞一個表名(pTbl)和where子句(pWhere)。 p可以有許多AND(例如fld1 =「a」AND fld2 =「b」AND ...)。這可能不是最好的辦法,但我需要動態SQL。存儲過程中的預準備語句是否安全地使用SQL注入?
CREATE PROCEDURE get_info(pTbl VARCHAR(10), pWhere TEXT)
BEGIN
SET @uSQL = CONCAT('SELECT info FROM ',pTbl,' WHERE ',pWhere);
PREPARE ps FROM @uSQL;
EXECUTE ps;
END$$
我打過電話像下面使用MySQL查詢瀏覽器的存儲過程,但只得到了一個錯誤回話說我在SQL有語法錯誤。
CALL get_info('tbl','1=1;SELECT * FROM information_schema.TABLES;');
如果它幫助任何存儲過程正在使用PDO從PHP調用,如下所示。 $ tbl是$ _SESSION變量,$ whr是$ _GET變量。
$s=$c->prepare("CALL get_info(?,?)");
$s->execute(array($tbl,$whr));
該存儲過程是否安全?如果不是,我將如何注入它?如果我從MySQL查詢瀏覽器vs網頁注入,它有什麼不同嗎?謝謝...
問題不完整;你沒有提及'$ tbl'和'$ whr'的來源。 –
@Ignacio Vazquez-Abrams,$ tbl是$ _SESSION變量,$ whr是$ _GET變量。 – Txoov
爲什麼爲此使用存儲過程,而不是在PHP中生成語句?您可以動態構建['WHERE'子句](http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable-size-variable-list),並仍然使用用戶輸入參數,從而防止注射。 – outis