安全的Web应用程序问题

Chr*_*ris 1 php apache ldap http

我正在实现一个Web应用程序,它通过soap服务器/客户端交互在后端启动.该网站通过https运行,LDAP正在进行身份验证.

截至目前,我推送所有没有cookie的用户,将其称为"userHash"以引用登录页面.登录页面接受用户名,传递并检查ldap以进行验证.如果它验证我在会话中存储了用户名,用户IP地址和时间戳.

最后,我构建了一个cookie和会话哈希信息:

SESSION['userHash'] = sha1($username.$userip.$timestamp); 
cookie['userHash'] = sha1($username.$userip.$timestamp); 
Run Code Online (Sandbox Code Playgroud)

这种方式在任何后续请求中我验证用户拥有cookie userHash与会话['userHash']的匹配值

这个设置安全吗?

此外,我想防止暴力攻击,并打算实现一个简单的数据库表来记录失败的尝试.目前我正在考虑:

id | username | timestamp | ipaddress | count 
Run Code Online (Sandbox Code Playgroud)

作为一张桌子.这是最好的方法还是有更好的方法?我在这个表中看到,如果我要将失败的尝试限制为每24小时3次,那么攻击者就有能力从同一个IP尝试每个用户名3次.(一面注意:此应用程序预计可用于可能位于子网上的潜在学校计算机实验室,因此显示来自同一IP地址的多个登录,因此我需要注意何时基于IP地址进行阻止. )

另一方面,我想知道是否有像"denyhosts"这样的用于http身份验证的东西?

jmz*_*jmz 5

您创建的哈希$hash = sha1($username.$userip.$timestamp);不安全,因为它可以从公共信息计算.用户名,用户IP和时间戳都是公开的,攻击者可以使用.您必须向哈希添加秘密信息,例如:

$hash = sha1($username.$userip.$timestamp.$secret);
Run Code Online (Sandbox Code Playgroud)

哪里$secret永远不会在您的脚本之外传达.如果需要,可以将公共数据存储到cookie:

$cookie = implode("/", array($username, $timestamp, $hash));
Run Code Online (Sandbox Code Playgroud)

然后在验证时,使用$ _SERVER ['REMOTE_ADDR']作为$ userip.

对于第二个问题,如果您已经存储了失败尝试的时间戳,则不需要count列.如果尝试来自已经失败的时间戳的相同地址,则可以拒绝它,因为人类不会在一秒钟内执行两次密码输入.

编辑添加:使失败尝试的限制非常小将使您的用户容易受到DOS的攻击.学校环境尤其有很多喜欢冒险的人,他们不介意敲打几个密码试图进入帐户.3次尝试后锁定它们,你也锁定合法用户......