我正在实现一个通过soap服务器/客户端交互在后端启动的Web应用程序。该网站通过https运行,LDAP正在进行身份验证。
截至目前,我推送没有cookie的所有用户,将其称为“userHash”以引用登录页面。登录页面接受用户名,传递并检查ldap以进行验证。如果它验证我在会话中存储了用户名,用户IP地址和时间戳。
最后,我构建了一个cookie和会话哈希信息:
SESSION['userHash'] = sha1($username.$userip.$timestamp);
cookie['userHash'] = sha1($username.$userip.$timestamp);
这种方式在任何后续请求中我验证用户拥有cookie userHash与会话的匹配值['userHash']
此设置是否安全?
此外,我想防止暴力攻击,并且要实现一个简单的数据库表来记录失败的尝试。目前我正在考虑:
id | username | timestamp | ipaddress | count
作为一张桌子。这是最好的方法还是有更好的方法?我在这个表中看到,如果我要将失败的尝试限制为每24小时3次,那么攻击者就有能力从同一个IP尝试每个用户名3次。 (一面注意:此应用程序预计可用于可能位于子网上的潜在学校计算机实验室,因此显示来自同一IP地址的多个登录,因此我需要注意何时基于IP地址进行阻止。 )
另一方面,我想知道是否有类似“denyhosts”的http认证?
答案 0 :(得分:5)
您创建的哈希$hash = sha1($username.$userip.$timestamp);
不安全,因为它可以从公共信息中计算出来。用户名,用户IP和时间戳都是公开的,攻击者可以使用。您必须向哈希添加秘密信息,例如:
$hash = sha1($username.$userip.$timestamp.$secret);
$secret
永远不会在您的脚本之外传递。如果需要,可以将公共数据存储到cookie中:
$cookie = implode("/", array($username, $timestamp, $hash));
然后在验证时,使用$ _SERVER ['REMOTE_ADDR']作为$ userip。
对于第二个问题,如果您已经存储了失败尝试的时间戳,则不需要count列。如果尝试来自已经失败的时间戳的相同地址,则可以拒绝它,因为人类不会在一秒钟内执行两次密码输入。
编辑添加:将失败尝试的限制设置得非常小会使您的用户容易受到DOS攻击。学校环境尤其有很多喜欢冒险的人,他们不介意敲打几个密码试图进入帐户。 3次尝试后锁定它们,并锁定合法用户......
答案 1 :(得分:0)
所有这些在中间人攻击中并不重要。如果您处理敏感信息,建议使用安全套接字层。
使用LDAPv3传输层安全性(TLS)扩展进行安全连接。
另外,请记录http-user-agent以区分同一网络上的计算机。
锁定用户帐户以防止暴力破坏始终是一个好主意。确保拒绝IP地址/用户代理组合,而不仅仅是IP地址。
现在他们发送时无法捕获信息,他们无法伪造cookie信息。对于那部分,它非常安全。可能还有其他因素,但由于我不了解它们,因此无关紧要。