繁体   English   中英

是否可以检查md5密码

[英]Is it possible to check a md5 password

更准确地说:我想检查用户是否输入了与数据库中的个人资料相同的密码。 我已经尝试过类似的方法,但是我没有收到回声:

$query2=mysql_query("SELECT emails_password,emails_id  FROM lala.in_emails  WHERE  emails_password ='md5($password)' AND emails_id='".$_COOKIE['LALA_ID']."'")or die(mysql_error());
if(mysql_num_rows($query2)>0){echo "same pass";}

所以也许md5算法总是会改变?

应当删除md5($ password)周围的那些单引号(')。 不,MD5哈希不会更改。

通过回显检查查询字符串以确保已填充所有变量:

echo "SELECT emails_password, emails_id  FROM lala.in_emails  WHERE  emails_password ='".md5($password)."' AND emails_id='".$_COOKIE['LALA_ID']."'";

您将得到类似

从lala.in_emails中选择emails_password,emails_id,在其中emails_password ='098f6bcd4621d373cade4e832627b4f6'和emails_id ='some-emails-id'

您的问题与Mysql语法相关,而不与哈希相关。
好的做法如下所示:

$password = md5($password.$global_salt.$_COOKIE['LALA_ID']);
$password = mysql_real_escape_string($password);
$lala_id  = mysql_real_escape_string($_COOKIE['LALA_ID']);
$query    = "SELECT emails_password,emails_id  FROM lala.in_emails  
             WHERE  emails_password ='$password' 
                AND emails_id='$lala_id'";
$result   = mysql_query($query) or trigger_error(mysql_error().$query);
if(mysql_num_rows($result)>0){echo "same pass";}

感谢Stephane和Imre L的出色评论,使此代码变得更好

附录:有评论的人指责我对MD5()函数结果使用了转义。
我觉得有必要为以后的读者解释:

如果您想到每个特定变量的数据源-您正在混合各层。
MD5()不进行任何“消毒”。 结果不包含特殊字符只是一个巧合。 但是,人们根本不应该想到这一点!
数据库层应独立于上下文。 它必须是完全抽象的。 无论您如何验证数据-MD5,仅拉丁字母,数字等-所有这些都与数据库层无关。 DB层应该知道数据源和格式的注释。 它应该只是执行使SQL具有正确语法的职责。 一天的验证规则可能会更改-对于纯密码或某些二进制格式可能包含空字节等。验证规则可能会更改,但数据库规则必须保持不变。

以准备好的语句为例:
您是否确定每个变量是否需要绑定? 不,您-对于每个变量,无论其形式如何,都可以无条件地执行。 因此,应该对引号中的数据进行转义。

1)使用mysql_real_escape_string()转义$ _COOKIE ['LALA_ID']以防止SQL注入。

2)使用更强大的hash版本,例如sha512

3)如果您考虑保护客户端的普通密码,则可以在客户端对密码进行哈希处理并将哈希发送到服务器。 在服务器上再次对其进行哈希处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM