Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带PDO的PHP:将santized输入(filter_var)与准备好的语句数据进行比较_Php_Sanitize - Fatal编程技术网

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

带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

我正在使用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内部解释和执行变量)。如果用户的电子邮件地址(或我正在评估的任何输入)是:

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'")

这两个例子都是显式地将字符串插入字符串中以创建新字符串,然后将其解释为某种形式的代码。只要您远离这些构造,这个特定的漏洞就不值得担心。

非常感谢,这减轻了您的负担。我在很多地方看到过“净化输入-转义输出”的咒语,以至于我害怕在任何地方处理未修改的输入。对不起,我没有足够的代表投票支持你,但我已经接受了这个答案。谢谢:)你可能还想看看。非常感谢,这减轻了你的负担。我在很多地方看到过“净化输入-转义输出”的咒语,以至于我害怕在任何地方处理未修改的输入。对不起,我没有足够的代表投票支持你,但我已经接受了这个答案。谢谢:)你可能还想看看。