【问题标题】:secure web application questions安全 Web 应用程序问题
【发布时间】:2010-08-02 12:32:44
【问题描述】:

我正在实现一个通过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 地址进行阻止。 )

另一方面,我想知道是否有类似“拒绝主机”的 http 身份验证?

【问题讨论】:

  • 您可能会在 serverfault.com 上得到更好的答案
  • 谢谢 我会在那里尝试,因为我正在编写应用程序,我认为在这里会更合适,但也可以在那里尝试!

标签: php apache http ldap


【解决方案1】:

您创建的哈希$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 次后将其锁定,您也锁定了合法用户...

【讨论】:

  • 感谢 cmets,但就您的最后一点而言......如果攻击者将他的尝试分布在用户名上怎么办?虽然这听起来很不寻常,但似乎是合理的,我认为将用户限制为每天 3 次失败的尝试会禁止此活动?
  • 在尝试失败时不一定需要用户名。你真的关心用户试图破解哪个帐户吗?但是请不要把限制做得这么小。如果您将限制设置为 3,您将容易受到另一种 DOS 的攻击:拒绝为您的用户提供服务。
  • 那么您认为可接受的登录限制是多少?每 10 分钟尝试 3 次失败?每 24 小时 10 次失败尝试?我只是不确定像这样的东西的最佳位置在哪里
  • 这取决于您部署软件的环境。我想说,如果您的应用程序暴露在一般 Internet 中,则针对 LAN 攻击使用与针对 WAN 攻击不同的策略。您提到您的应用程序将用于学校;这谈到了某些类型的用户和某些类型的滥用。学生是否从阻止教师登录中受益?确实没有任何限制,但是即使我使用 ssh 进行了三次尝试也失败了。不要将人为错误误认为是攻击。
【解决方案2】:

在中间人攻击中,所有这些都无关紧要。如果您处理敏感信息,非常推荐使用安全套接字层。

使用 LDAPv3 传输层安全 (TLS) 扩展来实现安全连接。

另外,记录 http-user-agent 以在同一网络上的计算机之间有所不同。

锁定用户帐户以防止暴力破解总是一个好主意。确保拒绝 IP 地址/用户代理组合,而不仅仅是 IP 地址。

现在他们无法在您发送信息时捕获信息,也无法伪造 cookie 信息。对于那部分,它非常安全。不过可能还有其他因素,但由于我不知道,所以不相关。

【讨论】:

  • 这些都是不错的 cmets,虽然我无法控制 LDAP 部署,但我只负责 Web 应用程序本身。关于浏览器代理的一件事是,我读到它们可以在更新或附加组件期间更改,这实际上会使会话失效。这是不用担心的事情,只需接受如果用户在登录时这样做,他们将失去他们的会话吗?
  • @Chris:UA 通常不会(也不应该)在正常运行期间真正改变;安装附加组件或浏览器更新是 IMO 足以保证重新授权的更改;而且,这种情况并不经常发生
  • Piskvor 是对的,不用担心这个。会话最终必须超时,并且大多数会话在浏览器更新后都会丢失。
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2011-10-10
相关资源
最近更新 更多