慕桂英3389331
2019-11-30 13:46:58
不久前開始使用PDO準備的語句,據我了解,它為您完成了所有轉義/安全性工作。例如,假設$ _POST ['title']是一個表單字段。$title = $_POST['title'];$query = "insert into blog(userID, title) values (?, ?)"$st = $sql->prepare($query);$st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT);$st->bindParam(2, $title);$st->execute();這真的安全嗎?我還需要做其他事情嗎?我還需要考慮什么?謝謝。
3 回答

尚方寶劍之說
TA貢獻1788條經驗 獲得超4個贊
嚴格來說,實際上不需要轉義,因為參數值永遠不會插值到查詢字符串中。
查詢參數的工作方式是在調用時將查詢發送到數據庫服務器prepare(),然后在調用時將參數值發送到數據庫服務器execute()。因此,它們與查詢的文本形式分開存放。SQL注入永遠不會有機會(提供的PDO::ATTR_EMULATE_PREPARES是錯誤的)。
因此,可以,查詢參數可以幫助您避免這種形式的安全漏洞。
他們是否100%證明沒有任何安全漏洞?不,當然不是。您可能知道,查詢參數僅在SQL表達式中代替單個文字值。您不能用單個參數替代值列表,例如:
SELECT * FROM blog WHERE userid IN ( ? );
您不能使用參數使表名或列名動態化:
SELECT * FROM blog ORDER BY ?;
您不能將參數用于任何其他類型的SQL語法:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
因此,在很多情況下,您必須在prepare()調用之前將查詢作為字符串處理。在這些情況下,您仍然需要仔細編寫代碼以避免SQL注入。
添加回答
舉報
0/150
提交
取消