rails:232
From: ABE Masahiro <abe@c...>
Date: Fri, 01 Jul 2005 12:45:40 +0900
Subject: [rails:232] CSRF対策は?
あべです。 scaffoldやroutingを素直に使ってしまうと、たとえloginや salted-loginの拡張を導入しても http://example.com/item/destroy/1 というリンクを外部に用意して踏ませることでログインユーザに アイテム1番を消させることができちゃいますよね。 http://www.takagi-hiromitsu.jp/diary/20050427.html#p01 によると、直前の画面にセッションIDを埋め込んでアクション側で 確認すれば必要十分ということなので、[rails:209]の例を こんなふうに改造してみました。 -- app/views/item/list.rhtml <!-- チェックしたアイテムをまとめて削除 --> <%= form_tag %> <table> <% @list.each do |item| %> <tr> <td><%= check_box_tag("sel[], item.id) %></td> <td><%= item.name %></td> </tr> <% end %> </table> <%= hidden_field_tag("sid", @session.session_id) %> # <- コレを追加 <%= submit_to("削除", :action => "m_delete") %> <%= end_form_tag %> -- app/controllers/item_controller.rb def m_delete if @params[:sid] == @session.session_id Item.find(@params[:sel]).map{|item| item.destroy } else # http://example.com/item/m_delete/1 などを踏まされたらしい flash[:notice] = "error" end redirect_to :action => "list" end これでうまくいきますが、このパターンをうまく再利用できる形に できないでしょうか。 あるいは、RailsのCSRF対策として既にこんなのが標準になってる というのがありましたらご教示ください。 -- ABE Masahiro <abe@c...> -- ML: rails@r... 使い方: http://QuickML.com/
-> 232 2005-07-01 05:45 [abe@c... ] CSRF対策は? 233 2005-07-01 05:52 ┗[abe@c... ]