我需要使用带有 Rails CSRF 保护机制的单页应用程序(React、Ember、Angular,我不在乎)。
我想知道是否需要每次都创建一个令牌ApplicationController
像这样:
class ApplicationController < ActionController::Base
after_action :set_csrf_cookie
def set_csrf_cookie
cookies["X-CSRF-Token"] = form_authenticity_token
end
end
或者我可以只创建一次令牌.
每个会话还是每个(非 GET)请求?
我认为令牌在会话有效之前仍然有效,对吧?
CLARIFY:
每次导航页面时,我都会看到 Rails 默认应用程序(服务器渲染的页面)更新 csrf-token。所以每次都会有变化。
所以在我的情况下,如果我为每个创建一个新令牌after_action
之前的 CSRF-Token 对于该会话仍然有效。那么,如何让之前的token失效呢?我必须?
因为只有当我使其无效时才有意义,对吗?
客户端(SPA)
只需要获取CSRF token即可每次会话一次。您可以在浏览器中保留它并在每个(非 GET)请求中发送它。
Rails 似乎会在每个请求上生成一个新的 CSRF 令牌,但它会接受该会话中生成的任何令牌。实际上,它只是针对每个请求使用一次性密码本来屏蔽单个令牌,以防止 SSL BREACH 攻击。更多详情请参见https://stackoverflow.com/a/49783739/2016618 https://stackoverflow.com/a/49783739/2016618。您不需要跟踪/存储这些令牌。
服务器端
我强烈建议使用Railsprotect_from_forgery
指令而不是自己在标头中编码 CSRF 令牌。它将为每个请求生成不同的屏蔽令牌。
您当然可以用不多的代码自己重现此内容,但我不明白您为什么需要这样做。
您需要使用 API 进行 CSRF 保护吗?
Yes!如果您使用 cookie 进行身份验证,则需要 CSRF 保护。这是因为 Cookie 会随每个请求一起发送,因此恶意网站可能会向您的站点发送 POST 请求并代表登录用户执行请求。 CSRF 令牌可以防止这种情况,因为恶意站点不会知道 CSRF 令牌。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)