3

可能重复:
警告:无法验证 CSRF 令牌真实性轨道

我使用 JQuery AJAX 发送 DELETE HTTP 请求。URL (/myitems/1234) 与注销 URL (/users/sign_out) 不同,但是在请求之后我发现用户会话被破坏了。

我正在使用设计身份验证 gem。

这是日志:

Started DELETE "/myitems/2538" for 127.0.0.1 at 2012-06-26 19:09:49 +0400
Processing by MyItemsController#destroy as */*
  Parameters: {"id"=>"2538"}
WARNING: Can't verify CSRF token authenticity
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 6 LIMIT 1
   (0.0ms)  BEGIN
   (0.0ms)  UPDATE "users" SET "remember_token" = NULL,
            "remember_created_at" = NULL,
            "updated_at" = '2012-06-26 15:09:49.055774'
            WHERE "users"."id" = 6
   (1.0ms)  COMMIT
Completed 401 Unauthorized in 7ms

routes.rb 包含一行:

resources :myitems

仅此而已。

控制器的删除代码:

def destroy
   puts 'delete'
end

更新

POST 请求也是如此。

4

1 回答 1

2

问题(正如@Thilo 在评论中所暗示的)是您的 AJAX 请求不包含 CSRF 令牌。如果 CSRF 令牌不匹配,Rails 的默认行为是清除会话。这就是您的会话被删除的原因。

解决方案:

1) 在您的 AJAX 请求中传递 CSRF 令牌。根据您的需要,您可以利用 Rails 的 UJS 代码自动添加适当的 CSRF 标头。

2) 跳过特定控制器操作的真实性令牌验证,尽管这可能会产生负面的安全影响。

我将其标记为社区 wiki,以便其他人可以改进它,因为我现在没有时间。

于 2012-06-26T16:07:33.907 回答