0

Railsのprotect_from_forgeryを手に入れたばかりで、アプリの簡単なログインを次のように記述しました。

クライアント側

<h1>Login</h1>

<%= form_for :session do |f| %>
  <p>
    <%= f.label :id %><br />
    <%= f.text_field :id %>
  </p>
  <p>
    <%= f.label :pw %><br />
    <%= f.text_field :pw %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>

サーバー側では、私の application_controller.rb に

protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }

ページからログインしようとしましたが、問題ないようです。少なくともログインできます。ただし、いくつか質問があります(私はwin OSを使用しています)

  1. protect_from_forgery; のオプションに関する詳細は見つかりませんでした。null_session、if: Proc.new { |c| に続くオプションについて詳細な説明を得ることができる側の誰かがあれば幸いです。c.request.format == 'アプリケーション/json' }

  2. フォームが CSRF 認証を使用し、通過しているかどうかを確認するにはどうすればよいですか? 送信されたフォームが「authenticity_token」であるパラメーターのセットのコンソールから見ることができますが、これは 1 つですか? はいの場合、どのように生成/定義されていますか? 私が見る限り、それは毎回同じです。

また、別のアプリケーション (Unity3D c# で記述) を以下で実行し、同じサーバーに接続しています。

WWWForm form = new WWWForm(); 
form.AddField("id", id); 
form.AddField("pw", pw);   
WWW www = new WWW(mainUrl + "login/", form);

今回も、クライアントは引き続きログインできますが、コンソールから次のような警告が表示されます。

WARNING: Can't verify CSRF token authenticity   

私はこれについてグーグルで検索しましたが、ほとんどの答えは、単に追加する必要があると言うことのようですskip_before_filter :verify_authenticity_tokenが、これは単にセキュリティチェックをバイパスするだけですか? しかし、ここでセキュリティチェックが必要なので、意味がありません...

これを修正し、ログイン セッションが protect_from_forgery でチェックされるようにするにはどうすればよいですか?

私の質問を手伝ってくれてありがとう!:)

4

1 に答える 1

0

非常に多くの質問があり、それぞれを説明することはできませんが、簡単に説明します。まず、 Rails APIprotect_from_forgeryから詳細な説明を見つけることができます。

また、Rails ガイドは、CSRF に関する詳細情報を提供します。

<head>
  <%= csrf_meta_tags %>
</head>

これらは、:method を使用して非リモート リンクを実装する動的フォームを生成するために使用されます。

これらのタグは独自の非表示フィールドを生成するため、通常のフォームにこれらのタグを使用する必要はありません。

GET 以外の AJAX リクエストの場合、メタタグから「csrf-token」を抽出し、「X-CSRF-Token」HTTP ヘッダーとして送信します。jquery-rails で jQuery を使用している場合、これは自動的に行われます。

于 2014-07-29T05:15:45.163 に答える