如果我创建一个全新的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开放吗?
答案 0 :(得分:1)
如果你传递了无效的CSRF令牌或没有它的发送请求,Rails将使会话无效,因此如果你的应用程序可以被所有人访问,protect_form_forgery
就没用了。
但如果您有基于会话的身份验证系统,它将从CSRF攻击中保存您的应用程序。