问题

我遇到了一些关于Rails中的真实性令牌的问题,因为我现在有很多次.

但我真的不想只是解决这个问题,继续.我真的想了解真实性令牌. 嗯,我的问题是,你有这个问题的一些完整的信息来源,或者你会花时间在这里详细解释吗?



解决方法

What happens

当用户查看表单以创建,更新或销毁资源时,Rails应用程序会创建一个随机的 authenticity_token ,将此标记存储在会话中,并将其放置在形成.当用户提交表单时,Rails寻找 authenticity_token ,将其与存储在会话中的值进行比较,如果匹配,请允许继续.

Why it happens

由于真实性令牌存储在会话中,所以客户端无法知道其值.这可以防止用户向Rails应用提交表单,而无需查看该应用本身中的表单. 想象一下,你使用服务A,你登录服务,一切都ok.现在想象你去使用服务B,你看到了你喜欢的图片,并按在图片上查看更大的尺寸.现在,如果服务B有某些恶意代码,它可能会向服务A(您已登录)发送请求,并要求删除您的帐户,方法是向 http://serviceA.com发送请求/ close_account .这就是所谓的 CSRF(跨网站请求伪造).

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

API文档介绍了元标记的详细信息:

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

Notes

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

Lessons

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


编辑:检查 @erturne的评论关于GET请求是幂等的.他用比我在这里做的更好的方式解释它.




相关问题推荐