rails - “WARNING: Can't verify CSRF token authenticity” for json devise requests如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

我如何检索CSRF令牌以传递JSON请求?

我知道,出于安全原因,Rails正在所有请求类型(包括JSON / XML)上检查CSRF令牌

我可以放入我的控制器skip_before_filter :verify_authenticity_token,但是我会失去CRSF保护(不建议:-))。

这种类似的(仍未被接受的表明

<%= form_authenticity_token %>检索标记

问题是如何?我是否需要首先打电话给我的任何页面来检索令牌,然后与Devise进行真正的身份验证?或者它是我可以从我的服务器获得的一次性信息,然后一直使用(直到我在服务器本身手动更改它)?

提问于
用户回答回答于

在Rails 4中,我现在使用@genkilabs在下面的注释中建议的内容:

protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }

其中,不是完全关闭内置安全性,而是在没有CSRF令牌的情况下击中服务器时可能存在的任何会话。

skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| c.request.format == 'application/json' }

这将关闭已正确标记的json帖子/ puts的CSRF检查。

例如,在iOS中将以下参数设置为NSURLRequest,其中“参数”是您的参数:

[request setHTTPMethod:@"POST"];

[request setValue:@"application/json" 
       forHTTPHeaderField:@"content-type"];

[request setValue:@"application/json" 
       forHTTPHeaderField:@"accept"];

[request setHTTPBody:[NSData dataWithBytes:[parameters UTF8String] 
                                            length:[parameters length]]];
用户回答回答于

可以在成功登录后使用自定义标题发送CSRF令牌。

例如,把它放在你的会话中#create:

response.headers['X-CSRF-Token'] = form_authenticity_token

提供CSRF令牌的示例登录响应头文件:

HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Connection: Keep-Alive
Content-Length: 35
Content-Type: application/json; charset=utf-8
Date: Mon, 22 Oct 2012 11:39:04 GMT
Etag: "9d719d3b9aabd413c3603e04e8a3933d"
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-10-12)
Set-Cookie: [cut for readability] 
X-Csrf-Token: PbtMPfrszxH6QfRcWJCCyRo7BlxJUPU7HqC2uz2tKGw=
X-Request-Id: 178746992d7aca928c876818fcdd4c96
X-Runtime: 0.169792
X-Ua-Compatible: IE=Edge

此令牌在再次登录或注销之前有效(如果通过API支持此功能)。客户端可以从登录响应头中提取并存储令牌。然后,每个POST / PUT / DELETE请求必须使用在登录时收到的值设置X-CSRF-Token标头。

使用CSRF令牌的POST标头示例:

POST /api/report HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate, compress
Content-Type: application/json; charset=utf-8
Cookie: [cut for readability]
Host: localhost:3000
User-Agent: HTTPie/0.3.0
X-CSRF-Token: PbtMPfrszxH6QfRcWJCCyRo7BlxJUPU7HqC2uz2tKGw=

文档:form_authenticity_token

扫码关注云+社区