当我使用PDO库时,我是否需要在输入(如$_POST
和$_GET
)上使用mysql_real_escape_string()
?
如何使用PDO正确转义用户输入?
// where $dbh is your PDO connection
$stmt = $dbh->prepare("SELECT * FROM animals WHERE animal_id = :animal_id AND animal_name = :animal_name");
/*** bind the paramaters ***/
$stmt->bindParam(':animal_id', $animal_id, PDO::PARAM_INT);
$stmt->bindParam(':animal_name', $animal_name, PDO::PARAM_STR, 5);
/*** execute the prepared statement ***/
$stmt->execute();
注意:变量绑定时会进行清理处理($stmt->bindParam
)。使用PDO时需要注意:
PDO只会将数据进行SQL注入防护,而不会针对你的应用程序进行防护。
因此,在执行写操作(如INSERT或UPDATE)时,仍然需要先过滤数据并进行其他方面的净化(例如删除HTML标签、JavaScript等等),这一点尤为重要。
<?php
$pdo = new PDO(...);
$stmt = $pdo->prepare('UPDATE users SET name = :name WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- filter your data first
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING); // <-- filter your data first
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- Automatically sanitized for SQL by PDO
$stmt->bindParam(':name', $name, PDO::PARAM_STR); // <-- Automatically sanitized for SQL by PDO
$stmt->execute();
如果不对用户输入进行消毒,黑客可能会将一些 JavaScript 保存到您的数据库中,然后在输出到您的网站时对您构成威胁!
WHERE
子句。开发人员应始终使用最好的白名单过滤器对来自客户端的输入进行清理。 - Luc Giffon