通过质询/响应来确保会话的每个请求?

Bac*_*chi 5 php java security web-applications

我们需要设计一个安全的Web应用程序。我想提出一种会话处理机制,该机制不仅针对使用CRAM方法的登录过程,还针对每个请求进行质询响应。

原因是加强Web应用程序以防止会话劫持(例如,通过CSRF进行攻击)以及重放或中间人攻击。

建议在某些地方使用随机数,但在我们的Web应用程序中似乎不切实际,因为异步请求可以继续进行,或者用户可以打开新窗口,单击后退按钮等。

想法:客户端和服务器具有共享的机密(先前建立的用户密码),每个后续请求都基于该机密再次进行质询/响应,例如“响应=哈希(挑战+ hashedPassword)”。仅当对质询的响应匹配时,服务器才执行请求。与CRAM期间非常相似,但每个请求都在进行中。

问题:这是否可行?如果是这样,它肯定已经实施了,甚至是某种标准?我们如何在基于Java或php的webapp中使用它?

Lar*_*ars 2

问题实际上取决于您想要实现什么。如果您想对抗 CSRF 攻击,除了会话密钥之外,秘密令牌也是您的最佳选择。然而,在每个请求中更改令牌会导致问题 - 不仅后退按钮会终止会话,而且由于一个网页通常包含大量异步和并行加载的数据(图像、CSS、JavaScript 等),因此您的方法之后将不会加载任何附加数据,因为每个附加请求都会更改所需的令牌,从而终止会话。

您可以通过 BASE64 和其他技巧将所有资源嵌入到页面中来解决此问题,但这将严重阻碍您的可能性,并且可能与某些浏览器存在兼容性问题。

因此,最终,您的方法不会增加太多安全性,但很可能会给您的客户带来一系列潜在问题。我会坚持在 URL 中的每个会话使用一个秘密令牌来对抗 CSRF,并集中精力防范其他攻击,例如 XSS 和用户友好的安全措施,例如使用智能手机进行两因素身份验证或类似的措施。毕竟,用户是当今第一大攻击媒介。


更新 (2012-06-14)

该令牌不会对抗 XSS 攻击,但会防御基本的 CSRF 攻击(例如,通过在图像中植入虚假 url 调用)。我今天在工作中实际上遇到了一种情况,我需要确保获取请求免受用户修改的影响并编写一些代码。该代码还可用于保护静态、会话超时formlink令牌(解决您的问题)。

这个想法是拥有一个服务器秘密,用于在数据上生成哈希/AuthToken 以确保安全。如果流氓 javascript 尝试更改任何给定数据,则 AuthToken 将不匹配。在我的具体问题中,我有一台服务器对用户进行身份验证,并且必须将其信息发送给第三方(用户名、邮件地址、姓名等)。身份验证后,任何用户都可以轻松更改此 GET-Request,因此我必须对 GET-Request-Parameters 进行身份验证。通过重新运行 AuthenticationToken-Process,第三​​方可以比较生成的 AuthToken,从而验证传入的数据。如果没有共享秘密,就几乎不可能伪造数据。

关于您的问题:在 GET 和 POST 请求上使用静态令牌(或像我的项目一样的动态令牌)将保护您免受简单的 CSRF 攻击,例如通过论坛中的链接进行的攻击,用户必须单击这些链接才能受到攻击。由于链接永远不会包含正确的令牌,因此您的网页是安全的。然而,如果攻击者设法通过 XSS 将 JavaScript 加载到网页中,那么您就完蛋了,世界上没有任何技术可以帮助阻止它,因为 JavaScript 可以扫描页面的整个 DOM 树以找到捕获任何令牌的方法。任何。

所以,归结为:

  • 在 GET 和 POST 请求上使用令牌来对抗 CSRF
  • 保护您的页面免受 XSS 注入