如何使用PDO对输入进行净化处理?

24

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

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

2个回答

37
如果你使用PDO,你可以使用参数化查询,从而消除了转义任何包含的变量的需要。
请参阅这里一个非常好的PDO入门教程。
使用PDO,您可以通过准备语句将SQL和传递的参数分离,这消除了转义字符串的需求。由于这两个部分被分别保存然后在执行时合并,因此参数会自动处理为字符串。来自上述来源的内容:
   // 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

谢谢你。我已经知道了,所以现在我不需要使用$animal_id = mysql_real_escape_string($_POST['blabla']),只需要直接使用$animal_id=$_POST['blabla']就可以了吗? - Karem
简单回答,是的! - SW4
好的,我正在使用预处理语句,只是想确认一下。谢谢! - Karem
1
@SW4,您能否编辑您的答案并解释清楚,为什么过滤操作发生在 $dbh->prepare() 而不是 $stmt->bindParam() 上?对于新手来说,这并不是很清楚。 - Guesser
@SW4 准备语句仅适用于 SQL 查询中的 WHERE 子句。开发人员应始终使用最好的白名单过滤器对来自客户端的输入进行清理。 - Luc Giffon
显示剩余3条评论

11

使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接