【问题标题】:Is it secure to get new csrf hash token from ajax response?从 ajax 响应中获取新的 csrf 哈希令牌是否安全?
【发布时间】:2017-12-12 17:12:10
【问题描述】:

我使用 zend 1 框架,并且我有多次使用 ajax 的表单,我使用 csrf 对其进行保护,但是在第一次请求 csrf 令牌后,我需要新的令牌。从服务器端传递新的 csrf 令牌并在前端用于新的 ajax 调用是否安全?

【问题讨论】:

    标签: php security zend-framework csrf csrf-protection


    【解决方案1】:

    滚动的 CSRF 令牌始终是一个糟糕的设计,因为如果用户打开了多个窗口,那么 CSRF 令牌当前有效的竞争条件就会发生。

    在实施任何安全系统时,请尝试使用现有库或有据可查的技术。不要从臀部射击,阅读CSRF prevention Cheat sheet

    轮换 CSRF 令牌不会提高安全性,因为相同的绕过技术将始终获得当前的 CSRF 令牌。所有 CSRF 缓解措施都依赖于 Same-Origin Policy - 如果您的应用程序绕过 SOP - 例如弱的 crossdomain.xml 文件或不安全的 CORS 规则集或 XSS - 那么攻击者可以使用此漏洞读取 任何 HTTP回应。对于任何给定的 Web 应用程序,某些 HTTP 响应必须具有 CSRF 令牌,并且可以使用 SOP 绕过来读取此令牌并伪造浏览器和 Web 应用程序之间的交互。

    采用何种类型的 CSRF 缓解措施并不重要 - XSS 始终可用于强制浏览器执行用户可以执行的任何操作。如果一个对反射型 XSS 有漏洞的请求,也需要一个 CSRF 令牌,那么它就很难或不可能被利用。正因如此,CSRF 和 XSS 有一种石头剪刀布的关系。

    【讨论】:

      【解决方案2】:

      如果您在防伪令牌行为方面遇到问题,您是否考虑过使用 SameSite cookie 标志来代替?

      长话短说。当您发送跨域请求(例如,站点 A 向站点 B 发送请求)时,您的浏览器也会检查您是否有该站点的 cookie,因此,您可能容易受到 XSRF 攻击.我们使用防伪令牌在发送请求的有效实体和服务器之间创建共享秘密。但正如您所见,实施可能存在一些问题。

      另一方面,同站点 cookie 标志允许您配置通过跨域请求发送 cookie 的方式。有两种模式,严格模式和宽松模式。

      在严格模式下,您的 cookie 永远不会通过跨域请求发送。这似乎是一个很好的方法,但您还需要考虑 cookie 不会通过 GET 请求发送,因此如果有人被重定向到您的站点,他将需要再次登录,因为 cookie 不是在那发送的请求。

      宽松模式的作用几乎相同,但它允许您的 cookie 通过安全的 HTTP 动词(GET、HEAD、OPTIONS 和 TRACE)发送,因此您可以防御 POST/PUT CSRF 攻击,但是您'用户通过 GET 请求浏览时仍会获得良好的行为。

      编辑: 只是补充一点,即使 SameSite cookie 标志听起来是个不错的选择,它也只有 Chrome 和 Opera 实现了,所以如果您的用户群是使用各种不同的浏览器和不同的版本,它可能不是您应用的最佳选择。

      【讨论】:

      • -1 SameSite 是一个 RFC 草案,并非所有浏览器都支持它,并且百年未准备好投入生产。我会在 5 年内将它常用的 -1 删除。
      • @rook 必须告诉你这一点,我忘了澄清,至少现在,SameSite cookie 标志仅由 Chrome 和 Opera 实现。
      猜你喜欢
      • 2015-08-17
      • 2014-07-17
      • 2016-02-08
      • 2019-07-12
      • 2017-10-29
      • 2010-09-13
      • 2017-01-15
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多