SW4*_*SW4 29
如果使用PDO,则可以对查询进行参数化,从而无需转义任何包含的变量.
请参阅此处获取有关PDO的精彩入门教程.
使用PDO,您可以使用预处理语句分离SQL并传递参数,这样就不需要转义字符串了,因为这两个单独保存然后在执行时组合,参数会自动处理为stings,来自上面的源:
// 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();
Run Code Online (Sandbox Code Playgroud)
注意:在变量绑定($stmt->bindParam)期间发生清理
其他资源:
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
http://www.phpeveryday.com/articles/PDO-Prepared-Statement-P550.html
http://php.net/manual/en/pdo.prepared-statements.php
使用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();
Run Code Online (Sandbox Code Playgroud)
如果不清理用户输入,黑客可能已经将一些javascript保存到您的数据库中,然后,当它输出到您的站点时,您将面临威胁!
http://www.phptherightway.com/#pdo_extension