什么应该是安全,安全,正确的服务器端密码验证响应?

时间:2012-11-24 18:49:11

标签: jquery mysql ajax security response

我正在尝试实现一个页面,员工可以登录并添加,修改,更新工作案例。

我有一个选择列表,其中包含从数据库加载的数据(人员名称)。在这个数据库中,我有基础知识,用户名,ID,密码,电子邮件。

选择列表/框的默认值为“ - ”;当它发生变化时,会弹出一个表格,要求输入SELECTed工作人员的密码。

使用jQuery,我将id,用户和密码(纯文本)发送到服务器。在php文件中 我转义(mysqli_real_escape_string)所有三个变量并哈希(md5($salt.$varname))密码。

我用SELECT * FROM table WHERE id='".$escapedId."' AND name='".$escapedName."'查询mysql数据库。

检查num_rows==1后是否$hashedPasswd==$mysqlresult['passwd']

$serverResponse->reponses['passwdOK']=true;
echo json_encode($serverResponse);

所以,我的两个问题是:我是否应该更改查询以包含密码(... WHERE passwd=$hashedPasswd...)以及我发送/返回JS文件的响应是否正常(确定我的意思是,如果这是安全的,安全的)。如果响应不安全/安全,那么正确的服务器响应是什么。

P.S。我不想重新加载或重定向到另一个页面,事实上,如果密码正常 我想解锁/启用已加载页面上的一些控件。

2 个答案:

答案 0 :(得分:2)

您的方法存在一些问题:

  • 如今,MD5完全不适合密码哈希,因为它太快了,因此很容易被暴力破解。请改用bcrypt,scrypt或PBKDF。
  • 我假设您使用全球盐来获取所有密码?如果是这样,这会使您的散列密码容易受到彩虹表攻击。相反,您应该为每个单独的用户随机生成一个salt并将它们存储在您的数据库中。实施bcrypt的图书馆通常已经为你做了腌制。
  • 手动转义每个查询参数,然后使用部分查询连接它们对于可能导致SQL注入漏洞的错误非常敏感。强烈建议您使用Prepared statements。在PHP中,这通常是通过PDO框架完成的。
  • 通过纯文本发送密码很危险,因此您确实应该使用HTTPS,以便加密用户和服务器之间的流量。但是,这将要求您拥有证书。您可以使用自签名证书,在这种情况下,可以访问您的应用程序的每个客户端都需要进行配置才能接受,或者让Certificate Authority签名,您需要为此付费。如果您不想或根本无法使用HTTPS,最好建议您的用户不要从开放的Wi-Fi网络登录,也不要使用与他们用于其他内容的相同密码。他们的电子邮件帐户。您也可以在客户端尝试散列密码(并再次在服务器端;不要忘记在这里也使用随机盐);这不会保护您免受中间人攻击,但可以阻止被动侦听器(更常见的)窥探密码。

答案 1 :(得分:0)

看起来不错,但您应该记住,浏览器和服务器之间的任何通信都应加密(https)。如果没有,服务器和浏览器之间的任何人都可以读取用户给出的所有数据(登录名,密码)。

我不认为您的查询是性能的最佳选择。如果密码与数据库中的密码不匹配,选择数据的目的是什么。查询应该是“WHERE id = id AND password ='hash'。

如果密码正常,数据库会向您发送用户数据,否则您将无法获得任何错误。我不是专业技能的mysql专家,但据我所知它是更好的解决方案。

而且,还有更多。你不需要逃避哈希。如果你从md5()函数中得到任何东西,它就已经“转义”了。

无论如何,我会这样做:

$id = (int) $_POST['id'];
$pass = md5(SALT.$_POST['pass']);
$query = 'SELECT * FROM `user_table` WHERE `id` = $id AND `password` = $pass;