【问题标题】:How do I sanitize input with PDO?如何使用 PDO 清理输入?
【发布时间】:2011-05-20 20:45:06
【问题描述】:

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

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

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    如果您使用 PDO,您可以对查询进行参数化,无需转义任何包含的变量。

    请参阅 here 了解 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']?
    • 如果您使用的是准备好的语句 - 您可以直接绑定变量而无需将其作为字符串转义...使用 PDO,它无论如何都会将其作为字符串执行/处理,从而防止任何注入尝试
    • 所以-更简单的回答,是的!
    • 是的,很好,我正在使用准备好的语句,只是想确定一下。谢谢!
    • @SW4 你能编辑你的答案来解释消毒发生在 $dbh->prepare... 而不是 $stmt->bindParam(... 作为 PDO 的新手,这不是很清楚。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 2013-06-10
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      相关资源
      最近更新 更多