Если я создаю совершенно новое приложение Rails (с использованием Rails 3.0.9) и быстро добавляю к нему строительные леса следующим образом:
$ rails new testing
$ rails g scaffold thing name:string
Тогда app / controllers / application_controller.rb по умолчанию содержит «protect_from_forgery», поэтому он должен проверять authenticity_token во время создания POST. По крайней мере, это мое понимание.
Почему тогда эта линия успешно создает новую вещь, не предоставляя токен.
$ 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?