gpt4 book ai didi

ruby-on-rails - 了解 Rails 真实性 token

转载 作者:数据小太阳 更新时间:2023-10-29 06:16:04 28 4
gpt4 key购买 nike

Rails 中的真实性 token 是什么?

最佳答案

会发生什么

当用户查看表单以创建、更新或销毁资源时,Rails 应用会创建一个随机的 authenticity_token,将此 token 存储在 session 中,并将其放置在形式。当用户提交表单时,Rails 查找 authenticity_token,将其与存储在 session 中的那个进行比较,如果匹配则允许请求继续。

为什么会这样

由于真实性 token 存储在 session 中,客户端无法知道其值。这可以防止人们在没有查看该应用程序本身的表单的情况下向 Rails 应用程序提交表单。想象一下,你正在使用服务 A,你登录到该服务,一切正常。现在想象一下,你去使用服务 B,你看到了一张你喜欢的图片,然后按下图片以查看更大尺寸的图片。现在,如果服务 B 存在一些恶意代码,它可能会向服务 A(您已登录)发送请求,并通过向 http://serviceA.example 发送请求来要求删除您的帐户/关闭账户。这就是所谓的 CSRF (Cross Site Request Forgery) .

如果服务 A 使用真实性 token ,则此攻击向量不再适用,因为来自服务 B 的请求将不包含正确的真实性 token ,并且将不允许继续。

API docs描述有关元标记的详细信息:

CSRF protection is turned on with the protect_from_forgery method,which checks the token and resets the session if it doesn't match whatwas expected. A call to this method is generated for new Railsapplications by default.The token parameter is named authenticity_token by default. The nameand value of this token must be added to every layout that rendersforms by including csrf_meta_tags in the HTML head.

注意事项

请记住,Rails 仅验证非幂等方法(POST、PUT/PATCH 和 DELETE)。不检查 GET 请求的真实性 token 。为什么?因为 HTTP 规范声明 GET 请求是幂等的,并且不应在服务器上创建、更改或销毁资源,并且请求应该是幂等的(如果多次运行相同的命令,您应该得到每次都是相同的结果)。

此外,真正的实现比开始时定义的要复杂一些,以确保更好的安全性。 Rails 不会对每个表单发出相同的存储 token 。它也不会每次都生成和存储不同的 token 。它在 session 中生成并存储加密哈希,并在每次呈现页面时发布新的加密 token ,这些 token 可以与存储的 token 进行匹配。参见 request_forgery_protection.rb .

类(class)

使用 authenticity_token 保护您的非幂等方法(POST、PUT/PATCH 和 DELETE)。还要确保不允许任何可能修改服务器资源的 GET 请求。


检查 the comment by @erturne关于 GET 请求是幂等的。他以比我在这里所做的更好的方式解释了它。

关于ruby-on-rails - 了解 Rails 真实性 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/941594/

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