带有PDO的PHP:将santized输入(filter_var)与准备好的语句数据进行比较



我正在使用PDO"prepared statements"将未初始化的数据插入mySQL数据库。我的理解是,这是减少sql注入的最佳实践,因为它本身就是一个净化步骤。

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

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

示例:

$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-var吗?(我不100%清楚何时或是否在php内部解释和执行变量)。如果用户的电子邮件地址(或我正在评估的任何输入)是:

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

php会关闭getUserName函数并执行头指令吗?

所以如果在这一点上我。。

getUserName(filter_var($email, FILTER_SANITIZE_STRING));

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

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

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

谢谢你的建议。

不,PHP不能以这种方式工作。变量内容不会插入到源代码中,然后不会使用插入的变量内容重新评估源代码。它在shell脚本中是这样工作的(在这里插入大量星号和说明),但在PHP或大多数其他正常的编程语言中不是这样。

getUserName($email);

这里$email包含分配给它的任何内容。它是什么并不重要。在任何情况下都不存在漏洞。这段代码说调用函数getUserName,并将$email的值作为其第一个参数传递给它多一点,少一点。它永远不会被解释为其他任何意思。没有必要为了这个目的而对这种价值进行消毒。

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

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

这两个例子都是将字符串显式插入字符串以创建新的字符串,然后将其解释为某种形式的代码。只要你远离这样的构造,这个特殊的漏洞就不会引起什么关注。

最新更新