【问题标题】:PHP with PDO: Compare santized input (filter_var) with prepared statement dataPHP 与 PDO:将经过过滤的输入 (filter_var) 与准备好的语句数据进行比较
【发布时间】:2015-06-24 07:51:53
【问题描述】:

我正在使用 PDO 'prepared statements' 将其他未经处理的数据插入到 mySQL 数据库中。据我了解,这是减轻 sql 注入的最佳做法,因为它本身就是一个清理步骤。

如果我在此步骤之前使用 filter_var 进行冗余清理,我会在数据库中获得带有转义字符的用户输入,这在稍后输出时当然看起来很难看。

我担心,如果我想稍后将用户输入与 db 数据进行比较,通过在那个阶段进行消毒,我会修改输入,使其不再匹配 db 数据。

例子:

$email = $_POST['email'];

//Insert the user supplied email (and other details) into the db
$sql = 'INSERT INTO author SET
        name = :userName,
        email = :email,
        password = :password';
    $s = $pdo->prepare($sql);
    $s->bindValue(':userName', $userName);
    $s->bindValue(':email', $email);
    $s->bindValue(':password', password_hash($password, PASSWORD_DEFAULT));
    $s->execute();

然后在稍后的代码中......

//Call a function that will use the provided email to lookup the username
getUserName($email);

getUserName 函数当然会再次使用准备好的语句来访问数据库。但是 php 会评估函数调用中的 $email 变量吗? (我不是 100% 清楚何时或是否变量在 php 内部被解释和执行)。如果用户的电子邮件地址(或我正在评估的任何输入)是:

);Header('Location: evilsite.com');exit();@example.com

php会关闭那个getUserName函数,然后执行header指令吗?

所以如果此时我改为..

getUserName(filter_var($email, FILTER_SANITIZE_STRING));

..那么我觉得我一直在努力清理用户输入,但我不能再用它来与数据库中的信息进行比较,因为它可能在清理过程中被修改了。

我在这里以电子邮件为例,但同样适用于任何输入。

理想情况下,为了安全起见,我想简单地清理收到的每个输入,这样我就可以在整个代码中不受惩罚地使用这些变量。但是我相信我需要对输出进行解码以使其格式正确,这样做我会让我的用户正确地受到 XSS 攻击吗?

感谢您的建议。

【问题讨论】:

    标签: php sanitize


    【解决方案1】:

    不,PHP 不能那样工作。变量内容不会插入到源代码中,然后源代码不会使用插入的变量内容重新评估。它在 shell 脚本中像这样工作(在此处插入大量星号和说明),但在 PHP 或大多数其他理智的编程语言中却不是。

    getUserName($email);
    

    这里$email 包含分配给它的任何内容。那是什么并不重要。在任何情况下都没有漏洞。这段代码说调用函数getUserName 并将$email 的值作为第一个参数传递给它。不多也不少。它永远不会被解释为其他任何含义。无需为此目的清除该值。

    唯一的时间值被插入到“代码”中,然后代码被执行是当你非常明确地这样做时:

    eval("getUserName($email)")
    $db->query("SELECT * FROM foo WHERE bar = '$email'")
    

    这些都是将字符串显式插入字符串以创建新字符串的示例,然后将其解释为某种形式的代码。只要您远离此类构造,就无需担心这种特殊的漏洞。

    【讨论】:

    • 非常感谢,这减轻了负担。我已经在很多地方看到了净化输入的口头禅 - 转义输出,我害怕在任何地方处理未经修改的输入。对不起,我没有足够的代表来支持你,但我已经接受了这个作为我需要的答案。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2010-11-05
    • 2015-03-30
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多