CSRF不在Rails中工作?

时间:2011-07-05 07:51:49

标签: ruby-on-rails csrf

如果我创建一个全新的Rails应用程序(使用Rails 3.0.9)并按如下方式快速删除脚手架:

$ rails new testing
$ rails g scaffold thing name:string

然后app / controllers / application_controller.rb默认包含“protect_from_forgery”,因此它应该在POST创建期间检查authenticity_token。至少,这是我的理解。

为什么然后,这行成功地创建了一个新的Thing,而不提供令牌。

$ curl -F "thing[name]=abc123" http://localhost:3000/things

日志条目说:

Started POST "/things" for 127.0.0.1 at 2011-07-05 08:29:18 +0100
  Processing by ThingsController#create as 
  Parameters: {"thing"=>{"name"=>"abc123"}}
  AREL (0.3ms)  INSERT INTO "things" ("name", "created_at", "updated_at") VALUES  ('abc123', '2011-07-05 07:29:18.484457', '2011-07-05 07:29:18.484457')
Redirected to http://localhost:3000/things/18
Completed 302 Found in 89ms

我也可以这样删除记录:

$ curl -X DELETE http://localhost:3000/things/18

在生产模式中也会发生同样的事情。这不会让我的应用程序对CSRF开放吗?

1 个答案:

答案 0 :(得分:1)

如果你传递了无效的CSRF令牌或没有它的发送请求,Rails将使会话无效,因此如果你的应用程序可以被所有人访问,protect_form_forgery就没用了。 但如果您有基于会话的身份验证系统,它将从CSRF攻击中保存您的应用程序。

更多信息:How does Rails CSRF protection work?