[前][次][番号順一覧][スレッド一覧]

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...            ]