Rails: How Does csrf_meta_tag Work?
我是一个PHP开发人员,通过阅读MichaelHartl的教程来学习RubyonRails。这是这本书的引述,参考
...the Rails method
csrf_meta_tag [prevents] cross-site request
forgery (CSRF), a type of malicious web attack. Don’t worry about the
details (I don’t); just know that Rails is working hard to keep your
application secure.
号
问题是,我真的很好奇。插入
如果使用jquery ujs库,则会自动将该元标记的内容(作为请求头)添加到所发出的任何Ajax请求中。
我想澄清一下,
换一种说法,从攻击者的角度来看:
在
这里有更详细的解释。
在一个Rails生成的页面上执行"查看源代码"也是有教育意义的,您将看到CSRF标签是什么样子的。
在轨道上,它会像这样工作
1 2 3 4 5 6 7 8 9 | def csrf_meta_tags if protect_against_forgery? [ tag('meta', :name => 'csrf-param', :content => request_forgery_protection_token), tag('meta', :name => 'csrf-token', :content => form_authenticity_token) ].join(" ").html_safe end end |
查看更多详细信息只需点击
您还需要检查Ruby on Rails安全指南
这是一个不错的博客
但是-我更喜欢国家脆弱性数据库,这是很好的解释
CWE-352:跨站点请求伪造(CSRF)
CWE-79:网页生成过程中输入的中和不当("跨站点脚本")。
检查此文档中的CWE-常见缺陷枚举
助手csrf_meta_标记的输出:
1 2 | <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="J/gw2ePXHS9Z1SUSSeUQgMmPhsPEFlFbMrLTLFHLfKjeWh7g4uyOnBlfKnlZlmCBiALDWdDWCSo1z0tybGVtfA==" /> |
号
这个令牌可以包含在Ajax请求中。示例(jquery ujs):
https://github.com/rails/jquery-ujs/blob/4b6e30f68ff1244fc0c790641d3408c2695a29bd/src/rails.js l70
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | csrfToken: function() { return $('meta[name=csrf-token]').attr('content'); }, // URL param that must contain the CSRF token csrfParam: function() { return $('meta[name=csrf-param]').attr('content'); }, // Make sure that every Ajax request sends the CSRF token CSRFProtection: function(xhr) { var token = rails.csrfToken(); if (token) xhr.setRequestHeader('X-CSRF-Token', token); }, |