gpt4 book ai didi

ruby-on-rails - CSRF token 与 session 中的 token 不匹配(Rails 4.1)

转载 作者:行者123 更新时间:2023-12-04 07:35:39 25 4
gpt4 key购买 nike

我们在Rails 4.1应用程序中看到了一个不幸的并且可能是基于浏览器的CSRF token 真实性问题。我们将其发布在这里,以询问社区是否也有人看到它。

请注意,大多数错误报告工具(例如Honeybadger)都会自动禁止 ActionController::InvalidAuthenticityToken ,因此,除非您全力以赴,否则通常不会在错误报告工具中看到问题。

这就是问题所在,这不是开发问题,而是尚未诊断的生产问题。

我们看到的异常只是在正常登录我们网站时的ActionController::InvalidAuthenticityToken。在仔细检查表单发送的 authenticity_token 和 session 的 _csrf_token (我们使用active_record_store作为session_store设置),时,它们与不匹配。经过直接检查,我只能得出结论,它们是完全不同的 token ,但我不知道为什么。

这不是一个简单的新手开发人员问题,请不要回答有关如何将CSRF token 从客户端传递到服务器或如何跳过 Controller 上的伪造保护的基本答案。我不希望听到有以下两个答案之一的任何人的信息:您不知道您在说什么,也不了解问题的深度和复杂性。 我只想听听那些访问量高的网站的人的声音,他们可以确认这种情况发生在访问者数量不多的情况下(奇怪的是,似乎某些浏览器比其他浏览器更容易受到影响。)

我们广泛地看到了这个问题,大约占我们高流量网站的1-2%。我只能在生产中看到它,无论如何我都无法复制它。

我在IE 11和Edge浏览器上看到的最多(您会注意到Rails 4.1是在IE 11和Edge之前发布的),但也可以在Android的Chrome上浏览,偶尔也可以在移动Safari上浏览。

我们的Cache-Control header 设置如下:
Cache-Control: max-age=0, private, must-revalidate

最佳答案

这已被确定并修复。在我们的Rails 4.1应用程序中未设置缓存控制 header ,导致默认 header 为

Cache-Control: max-age=0, private, must-revalidate

此 header 的强度不足以强制浏览器不进行缓存。因此,登录表单和JSON token 已由客户端浏览器(尤其是移动客户端)缓存,并返回已过期的session_id。

修理:

像这样设置cache-control和pragma header
Cache-Control:no-cache, no-store, max-age=0, must-revalidate


Pragma: no-cache

在rails中,将其添加到application_controller.rb:
before_action :set_cache_headers
def set_cache_headers
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "Mon, 01 Jan 1990 00:00:00 GMT"
end

它应该对您的应用程序中的每个操作都是全局的吗?这取决于您,但是您绝对希望在呈现表单的任何 Controller (尤其是登录表单)上或呈现JSON token 可能过期的任何页面上执行此操作。因此,在现代应用程序中,简短的答案是肯定的。

如果您明确希望保留Rails应用程序的响应缓存,则需要弄清楚如何在嵌入时显式使这些CSRF和JSON token 到期。

请注意,症状在大多数移动客户端上都以微妙的出现级别体现。

我在此处的博客文章中对此进行了探讨,请访问我的博客并考虑在此处进行评论以讨论: https://blog.jasonfleetwoodboldt.com/2017/09/03/the-great-rails-cache-lie/

关于ruby-on-rails - CSRF token 与 session 中的 token 不匹配(Rails 4.1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45329731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com