4

簡単な認証のためにhttp://railscasts.com/episodes/250-authentication-from-scratchをフォローしています。期待どおりに動作します。私は自分のアプリに次のモデルを持っていますpartial:

<%= content_tag_for(:li, post) do %>
  <%= link_to 'Delete', post, :confirm => 'Are you sure?', :method => :delete, :remote => true %>
<% end %>

内部では次のように呼び出さindex.html.erbれます。

<%= render :partial => @posts.reverse %>

は次のdestroy.js.erbとおりで、オブジェクトが正常に破棄された場合に呼び出されます。

$('#<%= dom_id(@post) %>').css('background', 'red');
$('#<%= dom_id(@post) %>').hide();

deleteボタンをクリックすると、postオブジェクトが適切に削除され、オブジェクトdestroy.js.erbも正しくレンダリングされます。しかし、どういうわけか、ユーザーはログアウトされます。以下は私のコードですposts_controller.rb

  def destroy
    logger.error 'in destroy'
    @post = Job.find(params[:id])
    @post.destroy

    respond_to do |format|
      format.html { redirect_to(posts_url) }
      format.xml  { head :ok }
      format.js
    end
  end

この動作の理由の手がかりはありますか?

:remote => trueそして、リンクからを削除するとdelete、ユーザーはログインしたままになります。どちらの場合も呼び出されないdestroyメソッドのログ ステートメントがありますが、' の場合、セッションは何らかの形で台無しになります。Cookie を確認したところ、Cookie は破棄されていませんが、メソッド onが呼び出されると変更されることがわかりました。なぜこれが起こらなければならないのか分かりません。session:remote=>truedestroyposts

4

1 に答える 1

4

Cross Site Request Forgeryから保護することを目的とした Rails セキュリティ機能に遭遇しているようです。追加する:remote => trueと、リクエストが CSRF セキュリティ トークンなしで ajax 経由で送信されるため、Rails は CSRF 攻撃であると判断してセッションを破壊します。これを回避するには、いくつかのオプションがあります。

  1. 手っ取り早く汚い (そして安全でない) 解決策は、その要求のセキュリティ チェックをオフにすることです。これを行うには、次の行をコントローラーの先頭に追加します。

    skip_before_filter :verify_authenticity_token, :only => [:destroy]

  2. より安全な解決策はCSRF、AJAX 呼び出しでトークンを送信することです。リモートリンクを に変更すると、これは自動的に行われると思いますbutton_to。詳細はこちらをご覧ください

    <%= button_to 'Delete', post, :confirm => 'Are you sure?', :method => :delete, :remote => true %>

  3. セッションではなく current_user を保存するために Cookie を使用することもできます。これによるセキュリティへの影響は、アプリの詳細によって異なります。

于 2012-08-29T05:53:45.780 に答える