Rails的会议上得到DELETE请求破坏

问题描述:

可能重复:
WARNING: Can't verify CSRF token authenticity railsRails的会议上得到DELETE请求破坏

我送使用JQuery AJAX一个DELETE HTTP请求。 URL(/ myitems/1234)与注销URL(/ users/sign_out)不同,但在请求后,我发现用户会话已被销毁。

我正在使用Devise验证宝石。

这里是日志:

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 

,仅此而已有关myitems。

控制器对删除代码:

def destroy 
    puts 'delete' 
end 

更新

同样发生在POST请求。

+0

请显示您的控制器代码的删除方法。 –

+0

我更新了问题。 – Paul

+1

查看http://stackoverflow.com/questions/7203304/warning-cant-verify-csrf-token-authenticity-rails – Thilo

这个问题(如@Thilo评论所暗示的)是您的AJAX请求不包含CSRF标记。 Rails的默认行为是在CSRF令牌不匹配的情况下清除会话。这就是你的会话被删除的原因。

解决方案:

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

2)跳过特定控制器操作的真实性标记验证,虽然这可能会产生负面的安全隐患。

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