【发布时间】: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 攻击吗?
感谢您的建议。
【问题讨论】: