Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.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
“你能”吗;SQL注入";PHP变量比较?_Php_Security_Login - Fatal编程技术网

“你能”吗;SQL注入";PHP变量比较?

“你能”吗;SQL注入";PHP变量比较?,php,security,login,Php,Security,Login,因此,在处理当前项目时,我一直在想,当用户输入一个变量时,一个简单的变量比较是否有遭受“SQL注入”类型攻击的危险 我的基本登录功能的工作原理是使用用户提供的用户名,并使用准备好的语句在profiles表中查找它。如果找到记录,则会从记录中检索profileID,并用于在另一个权限表中查找用户的密码。如果该查询成功,则用户提供的密码与从数据库检索到的密码相对应 所以我的问题是,最后一步会带来风险吗?我曾尝试自己“破解它”,通过输入诸如a'='a'| |'a之类的值,试图错误地触发$pass===

因此,在处理当前项目时,我一直在想,当用户输入一个变量时,一个简单的变量比较是否有遭受“SQL注入”类型攻击的危险

我的基本登录功能的工作原理是使用用户提供的用户名,并使用准备好的语句在profiles表中查找它。如果找到记录,则会从记录中检索
profileID
,并用于在另一个权限表中查找用户的密码。如果该查询成功,则用户提供的密码与从数据库检索到的密码相对应


所以我的问题是,最后一步会带来风险吗?我曾尝试自己“破解它”,通过输入诸如
a'='a'| |'a
之类的值,试图错误地触发
$pass===$checkPermRow['pass']
,但它似乎没有任何作用。我安全吗?

如果使用prepared语句并将输入作为参数传递给prepared语句,那么SQL注入是安全的。应该正确处理参数,并且不可能将传递参数的片段解释为SQL代码而不是数据。这就是参数化的确切意义,即。e、 代码和数据参数的分离

因此,应该不可能向查询中注入任何内容。但是,不应以明文形式存储密码,而应使用适当的哈希函数以不可逆形式存储为哈希


至于您的问题,在PHP本身中是否也可以进行注入:是的,代码注入可以发生在动态生成的任何代码中,所以即使在PHP中也是如此

但是,您不仅需要动态生成代码,还需要执行它。PHP有一些执行PHP的函数,例如。g、 ,该。但是,您可能不会使用如下构造:

if (eval("return '$pass' === '$checkPermRow[pass]';"))
这很容易受到攻击,而
a'='a'| |'a
会导致类似以下情况:

return 'a' == 'a' || 'a' === 'password from database';

还有一个问题。在PHP中使用预先准备好的语句被认为是为了取代仅仅“转义”用户提供的字符串的固有风险。但是,在将用户字符串插入到准备好的查询中之前,是否仍应先将其转义?如果您已经将恶意字符串存储到数据库中,并且最近使用它进行嵌套查询,则会有一些风险,但大多数适配器在这方面也足够聪明。您仍然可以检索您担心的字段,并将它们放在prepared语句中。例如:
从用户中选择密码,其中user=:user
您检索
密码,但您担心它<代码>$pass=$row['password']
<代码>从访问中选择权限,其中user_pass=:user_pass
$stmt->bindValue(“:user_pass”,$row['password'],PDO:PARAM_STRING)if(eval(“$pass”===“$checkPermRow[pass]”)
),上面提到的例子对PHP也是一样的。这就是我想要的。谢谢