我用AJAX从视图向控制器发送数据我得到了这个错误:
警告:无法验证CSRF令牌的真实性
我想我必须发送带有数据的令牌.
有谁知道我该怎么做?
编辑:我的解决方案
我通过将以下代码放在AJAX帖子中来完成此操作:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
Run Code Online (Sandbox Code Playgroud) 我有一个Rails 5 API应用程序(ApplicationController < ActionController::API).需要为此API的一个端点添加一个简单的GUI表单.
最初我ActionView::Template::Error undefined method protect_against_forgery?在尝试渲染表单时得到了.我添加include ActionController::RequestForgeryProtection并protect_from_forgery with:exception到终点.哪个问题按预期解决了.
但是,当我尝试提交此表格时,我得到:422 Unprocessable Entity ActionController::InvalidAuthenticityToken.我添加<%= csrf_meta_tags %>并验证了它meta: csrf-param并且meta: csrf-token存在于我的标题中,并且authenticity_token存在于我的表单中.(令牌本身彼此不同.)
我试过了protect_from_forgery prepend: true, with:exception,没有效果.我可以通过评论来"修复"这个问题:protect_from_forgery with:exception.但我的理解是,这正在关闭我的表格上的CSRF保护.(我想要CSRF保护.)
我错过了什么?
更新:
为了明确这一点,99%的应用程序是纯JSON RESTful API.需要添加一个HTML视图和表单到这个应用程序.因此,对于一个控制器,我想启用完整的CSRF保护.该应用程序的其余部分不需要CSRF,可以保持不变.
更新2:
我只是将这个应用程序的HTML表单和Header的页面源与我编写的另一个传统的Rails 5应用程序进行了比较.的authenticity_token页眉和authenticity_token形式是相同的.在我遇到问题的API应用程序中,它们是不同的.也许那是什么?
更新3:
好的,我不认为不匹配是问题.但是,在工作和非工作应用程序之间的进一步比较中,我注意到网络> Cookie中没有任何内容.我_my_app-session在工作应用程序的cookie中看到了很多东西.
我正在使用Sinatra框架在ruby中构建一个简单的应用程序.它主要是"获取" - 大多数请求将用于列出数据.但是,应用程序中有几个关键屏幕将收集用户输入.我想确保应用程序尽可能安全,并且目前正试图找到如何实现您在Rails表单中获得的真实性令牌?
我必须去的地方:嗯,我知道我需要csrf的令牌,但我不确定我是否需要自己生成它们,或者Sinatra是否可以为我做这些 - 我已经查看了文档并且他们说Sinatra正在使用机架保护,但是,我找不到它的任何示例代码,似乎无法弄清楚如何实现它 - 任何帮助升值 - 谢谢!