带PDO的PHP:将santized输入(filter_var)与准备好的语句数据进行比较
我正在使用PDO“prepared statements”将未初始化的数据插入mySQL数据库。据我所知,这是缓解sql注入的最佳实践,因为它本身就是一个净化步骤 如果我在这一步之前用filter_var进行冗余清理,我会在数据库中得到带有转义字符的用户输入,这当然在以后输出时看起来很难看 我担心的是,如果我想稍后将用户输入与db数据进行比较,那么在该阶段,我会修改输入,使其不再与db数据匹配 例如:带PDO的PHP:将santized输入(filter_var)与准备好的语句数据进行比较,php,sanitize,Php,Sanitize,我正在使用PDO“prepared statements”将未初始化的数据插入mySQL数据库。据我所知,这是缓解sql注入的最佳实践,因为它本身就是一个净化步骤 如果我在这一步之前用filter_var进行冗余清理,我会在数据库中得到带有转义字符的用户输入,这当然在以后输出时看起来很难看 我担心的是,如果我想稍后将用户输入与db数据进行比较,那么在该阶段,我会修改输入,使其不再与db数据匹配 例如: $email = $_POST['email']; //Insert the user su
$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内部解释和执行变量)。如果用户的电子邮件地址(或我正在评估的任何输入)是:
php会关闭getUserName函数,然后执行header指令吗
所以如果在这一点上我
getUserName(filter_var($email, FILTER_SANITIZE_STRING));
…然后我觉得我一直在努力清理用户输入,但我不能再使用它与数据库中的信息进行比较,因为它可能在清理过程中被修改过
我在这里以电子邮件为例,但这同样适用于任何输入
理想情况下,我希望简单地对我收到的每个输入进行清理,只是为了安全,这样我就可以在整个代码中使用这些变量而不受惩罚。但我相信我需要解码输出,使其格式正确,这样我就可以让我的用户暴露在XSS攻击之下,对吗
谢谢你的建议。不,PHP不是那样工作的。变量内容不会插入到源代码中,然后源代码不会使用插入的变量内容重新计算。它在shell脚本中是这样工作的(在这里插入大量的星号和说明),但在PHP或大多数其他sane编程语言中不是这样
getUserName($email);
此处$email
包含分配给它的内容。那是什么并不重要。在任何情况下,这里都没有漏洞。此代码表示调用函数getUserName
,并将$email
的值作为其第一个参数传递给它。不多不少。它永远不会被解释为意味着其他任何东西。没有必要为此目的对该值进行消毒
唯一的时间值被插入到“代码”中,并且当您非常明确地这样做时,代码将被执行:
eval("getUserName($email)")
$db->query("SELECT * FROM foo WHERE bar = '$email'")
这两个例子都是显式地将字符串插入字符串中以创建新字符串,然后将其解释为某种形式的代码。只要您远离这些构造,这个特定的漏洞就不值得关注。不,PHP不是这样工作的。变量内容不会插入到源代码中,然后源代码不会使用插入的变量内容重新计算。它在shell脚本中是这样工作的(在这里插入大量的星号和说明),但在PHP或大多数其他sane编程语言中不是这样
getUserName($email);
此处$email
包含分配给它的内容。那是什么并不重要。在任何情况下,这里都没有漏洞。此代码表示调用函数getUserName
,并将$email
的值作为其第一个参数传递给它。不多不少。它永远不会被解释为意味着其他任何东西。没有必要为此目的对该值进行消毒
唯一的时间值被插入到“代码”中,并且当您非常明确地这样做时,代码将被执行:
eval("getUserName($email)")
$db->query("SELECT * FROM foo WHERE bar = '$email'")
这两个例子都是显式地将字符串插入字符串中以创建新字符串,然后将其解释为某种形式的代码。只要您远离这些构造,这个特定的漏洞就不值得担心。非常感谢,这减轻了您的负担。我在很多地方看到过“净化输入-转义输出”的咒语,以至于我害怕在任何地方处理未修改的输入。对不起,我没有足够的代表投票支持你,但我已经接受了这个答案。谢谢:)你可能还想看看。非常感谢,这减轻了你的负担。我在很多地方看到过“净化输入-转义输出”的咒语,以至于我害怕在任何地方处理未修改的输入。对不起,我没有足够的代表投票支持你,但我已经接受了这个答案。谢谢:)你可能还想看看。