这段PHP代码是否为SQL注入打开了一个网站

这段PHP代码是否为SQL注入打开了一个网站,php,sql,security,sql-injection,Php,Sql,Security,Sql Injection,我正在开发一个web应用程序,我遇到了这个代码snippit $email=$_POST['email']; $pass=$_POST['pass']; $pass=md5($pass); $query=mysql_real_escape_string($email,$link); //echo $query."<br>"; $sql=mysql_query("SELECT pass FROM users WHERE email='".$email."'",$link); if($r

我正在开发一个web应用程序,我遇到了这个代码snippit

$email=$_POST['email'];
$pass=$_POST['pass'];
$pass=md5($pass);
$query=mysql_real_escape_string($email,$link);
//echo $query."<br>";
$sql=mysql_query("SELECT pass FROM users WHERE email='".$email."'",$link);
if($row=mysql_fetch_array($sql))
{
$email=$\u POST['email'];
$pass=$_POST['pass'];
$pass=md5($pass);
$query=mysql\u real\u escape\u字符串($email,$link);
//echo$query。“
”; $sql=mysql_query(“选择来自用户的传递,其中email='”、$email.“,$link); if($row=mysql\u fetch\u数组($sql)) {
我认为程序员打算把
$query=mysql\u real\u escape\u string($email,$link);
变成
$email=mysql\u real\u escape\u string($email,$link);


我的想法正确吗?

是的,
$email
已设置,但没有过滤,它直接用于查询。正如您所指出的,这看起来像是一个错误,因为过滤后的值没有在查询中使用。

是的,您完全正确-正如您所说,只需将其更改为

 $email = mysql_real_escape_string($email, $link);
,这将防止SQL注入


另一方面,我建议您使用
散列(“sha512”,xxx)
而不是
md5
,因为md5已经过时了。如果您的列大小不允许这样做,并且您没有能力更改它,那么仍然可以。

为了防止盲目SQL,请使用两个以上的过滤器包装您的POST数据:

$email = mysql_real_escape_string(strip_tags(stripslashes($email)), $link)

不要使用MD5;它不是一个安全的散列。@Slaks,我知道MD5不再是行业标准,但使用它的人到底有什么风险?MD5坏到足以破坏任意散列吗?如果我有一个使用它的遗留系统,我不会特别担心,但我可能错了,我想知道!是的,MD5坏到足以破坏它打破任意散列。“存在冲突攻击,可以在具有2.6Ghz奔腾4处理器的计算机上在几秒钟内找到冲突。”存储的pass=sha256(pass+username+salt),其中salt是只有代码知道的秘密密码(通过配置)-全部3个,因为如果您同时使用用户名,两个具有相同密码的人将不会有相同的哈希值。再次使用DBD?我现在是目标吗?很抱歉,我投了反对票,因为这没有回答所问的问题,他问的是SQL注入,而不是一般的哈希值。这里有一个SQL注入漏洞,它位于值pa中直接插入SQL字符串。这可能会让阅读此问题和答案的人感到困惑,因为他们是完全不同的问题。我现在已经删除了下一票,因为显然使用Md5比我想象的要糟糕得多!@Tom Gullen:我的第一句话刚刚说OP是正确的-这是一个漏洞,他们使用的修复方法是正确的ggested是正确的。很抱歉不清楚,我会编辑。