0

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

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

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

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

我用SELECT * FROM table WHERE id='".$escapedId."' AND name='".$escapedName."'.

检查我是否num_rows==1以及是否$hashedPasswd==$mysqlresult['passwd']这样做后:

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

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

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

4

2 回答 2

2

您的方法存在一些问题:

  • 如今,MD5 完全不适合密码散列,因为它太快了,因此很容易被暴力破解。请改用 bcrypt、scrypt 或 PBKDF。
  • 我假设您对所有密码都使用全局盐?如果是这样,这会使您的散列密码容易受到彩虹表攻击。相反,您应该为每个单独的用户随机生成一个盐并将它们存储在您的数据库中。实现 bcrypt 或类似的库通常已经为您完成了加盐处理。
  • 手动转义每个查询参数,然后将它们与部分查询连接起来,对于可能导致 SQL 注入漏洞的错误非常敏感。强烈建议改用Prepared 语句。在 PHP 中,这通常是通过 PDO 框架完成的。
  • 通过明文发送密码很危险,因此您确实应该使用 HTTPS,以便加密用户和服务器之间的流量。但是,这将要求您拥有证书。您可以使用自签名证书,在这种情况下,每个可以访问您的应用程序的客户端都需要配置为接受它,或者让它由证书颁发机构签名,您需要为此付费。如果您不想或根本不能使用 HTTPS,建议您的用户不要从开放的 wi-fi 网络登录,并且不要为您的应用使用与他们用于其他用途的密码相同的密码,例如他们的电子邮件帐户。您还可以尝试在客户端(并在服务器端再次使用哈希密码;不要忘记在这里也使用随机盐);这不会保护您免受中间人攻击,但可以防止被动侦听器(更常见)窥探密码。
于 2012-11-24T19:10:09.493 回答
0

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

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

如果密码正确,数据库将向您发送用户数据,如果不是,您将不会得到除 FALSE 之外的任何信息。我不是专业技能 mysql 专家,但据我所知,这是更好的解决方案。

而且,更重要的是。您不需要转义哈希。如果你从 md5() 函数中得到任何东西,它已经被“转义”了。

无论如何,我会这样做:

$id = (int) $_POST['id'];
$pass = md5(SALT.$_POST['pass']);
$query = 'SELECT * FROM `user_table` WHERE `id` = $id AND `password` = $pass;
于 2012-11-24T19:07:07.867 回答