“你能”吗;SQL注入";PHP变量比较?
因此,在处理当前项目时,我一直在想,当用户输入一个变量时,一个简单的变量比较是否有遭受“SQL注入”类型攻击的危险 我的基本登录功能的工作原理是使用用户提供的用户名,并使用准备好的语句在profiles表中查找它。如果找到记录,则会从记录中检索“你能”吗;SQL注入";PHP变量比较?,php,security,login,Php,Security,Login,因此,在处理当前项目时,我一直在想,当用户输入一个变量时,一个简单的变量比较是否有遭受“SQL注入”类型攻击的危险 我的基本登录功能的工作原理是使用用户提供的用户名,并使用准备好的语句在profiles表中查找它。如果找到记录,则会从记录中检索profileID,并用于在另一个权限表中查找用户的密码。如果该查询成功,则用户提供的密码与从数据库检索到的密码相对应 所以我的问题是,最后一步会带来风险吗?我曾尝试自己“破解它”,通过输入诸如a'='a'| |'a之类的值,试图错误地触发$pass===
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($user_entered_data==check_value),我可以确信这条语句不会受到用户输入的恶意值的影响(无论是有意还是无意)@BenW301 PHP也有数据和代码的分离。只有当您动态地生成PHP代码时(例如,if(eval(“$pass”===“$checkPermRow[pass]”)
),上面提到的例子对PHP也是一样的。这就是我想要的。谢谢