![](/img/trans.png)
[英]AngularJS - Check user/password in Login Service using md5 Password
[英]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.