如何使用 PDO 清理输入?

2022-08-30 19:04:55

当我使用 PDO 库时,我是否需要在我的输入(如 和 )上使用?mysql_real_escape_string()$_POST$_GET

如何使用 PDO 正确转义用户输入?


答案 1

如果使用 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();

注意:在变量绑定($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


答案 2

使用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保存到您的数据库中,然后,当它输出到您的网站时,您将面临威胁!

http://www.phptherightway.com/#pdo_extension


推荐