2017-12-29 32 views
0

CSRFの実際の動作は分かっていますが、通常、セッション内にランダムなテキストが格納され、隠しトークンのCSRFフィールドにHTMLフォームと同じ内容が格納されます。ユーザーがフォームを送信すると、セッションCSRFと一致するHTMLフォームトークンとそれぞれ検証されます。フレームワークCSRFトークンの格納方法と処理方法の問い合わせ

私がページをリフレッシュすると、新しいCSRFトークンが生成され、次のリフレッシュまで一度だけ有効になります。この場合、同じフォームを新しいタブで複数回開いて、後続のフォームを送信すると、フレームワークや誰もセッションにトークンを格納して検証することができます。最新のトークンを格納しているか、配列の形で生成されたすべての新しいトークンを格納し、トークンを検証した後、セッションからトークンを削除します。

HTMLフォームを複数のタブで開いて順番に送信したときに、同じユーザーの複数のトークンを処理する方法がわかりません。

私はコントローラにセッションをダンプしていますが、私の前提として、そこにあるすべてのトークンを見ることはできません。

誰でもどのように処理するのか理解できます。

+0

通常、各トークンは1つずつ表示され、

が送信されます。それぞれに対応するCheck。したがって、ある時点でアクティブなトークンは1つしかありません。それ以外の場合は動作しません。 – halojoy

+0

には、1つのトークンが生成され、同時に1つの$ _SESSION値があります。 が提出されると、$ _sessionの値に対して投稿されたトークンをテストします。一致するはずです – halojoy

+0

@halojoyそうなら、私のフォームはどうなりますか?私は** product **のページを持っていると考えて、複数の製品を追加したいと思います。だから、私は複数のタブでフォームを開きます(例えばtab1、tab2、tab3、tab4はすべて製品フォームページを持っています)。私は最初のタブ1を埋める場合、それは正常に動作し、それは後続のタブでも動作します。 ** –

答えて

-1

Codeigniterのcsrf_tokenとは何ですか? [Codeigniter CSRF - how does it work

+0

リンクをありがとう。しかし、それは私が探しているものを私に説明しません。単なる書式についてだけ言います。しかし、私は別のタブで後続のフォームを探していて、一度個別に提出するとどのように注意を払うことになります。 –

+0

ドキュメントを使ってリンクを投稿することは、特に文脈を提供したり追加したりしない場合には、良い回答ではありません。これは答えではなくコメントです。さらに、ドキュメンテーションは質問を明示的に扱っていない。 – Alex

0

私はそれは提出後

session_start(); 
<form method="post" accept-charset="UTF-8"> 
    <input type="submit" value="<?php echo SUBMIT ?>"> 
    <input type="hidden" name="_token" value="<?php echo CSRF::generate() ?>"> 
</form> 

と受信ページを取得することができますので、簡単ですhttps://github.com/Vundo/CSRF
を使用:CodeIgniterので

$session_start(); 
if(isset($_POST['xxxxxxx'])) { 
    if(!CSRF::check($_POST['_token'])){ 
     exit('Wrong Token!'); 
    } 
+0

リンクをありがとう。しかし、それは私が探しているものを私に説明しません。それ以降のフォームを別のタブで説明し、一度個別に送信すると、どのように注意が払われますか。それが実際に実装する方法 –

+0

トークンがオーバーライドされるため。異なるタブで開いたフォームが機能すると思いますか?もしそうなら、それを私に説明してください。 –

+0

提出後に開く結果の一部または全部を確認することができます。トーキーは元のページで一度だけ作成されるため、すべて同じです。 – halojoy

0

フォームを開くたびに、またはあなたのケースでは、新しいタブ(あなたはブラウザタブを意味しますか?)あなたはトークンを取得します。このトークンは格納され、form_openを隠し入力に出力します。送信時には、格納されているトークンとフォームトークンが同じであることを確認します。ハロージョイが概説したような非常に単純なプロセスです。

あなたが述べたコメントでは、複数のフォームを別のタブで開いているにもかかわらず、CSRFエラーなしでフォームを送信できます。これは、トークンがすべての提出(デフォルト)に再生したりCSRFクッキーの生活を通して同じ を保つことができるのいずれか$config['csrf_regenerate'] = FALSE;

を設定する構成に最も可能性が高いです。デフォルトの トークンを再生成すると、より厳しいセキュリティが提供されますが、他のトークンが無効になる( ナビゲーション、複数のタブ/ウィンドウ、非同期アクションなど)ため、使用可能性の問題が発生する可能性があります。あなたははクッキーを使用すると、フォームで新しいタブを開くたびに再生成されますを有効に再生成していた場合は、 そこで、基本的

次configパラメータを編集することによって、この動作を変更することがあります。したがって、最後に開いたフォームは、最後に有効なCSRFトークンを設定して唯一のものになります。

例:

  • タブ1:フォームセット123としてトークンと隠しフィールド123としてトークンを取得します。 (タブ2を開く)
  • タブ2:タブ1でフォームがまだ隠しフィールドに123などのトークンを持っていますが、今トークンが456である(再生)と隠しフィールドはタブ456(有効)

フォームです1は送信時に失敗し、タブ2のフォームは成功します。

+0

私は私のプレーンなPHPプロジェクトで同じことを実装したいと思っています。ユーザーが複数のタブでフォームを開く場合は、複数のタブの代わりに1つのフォームのみを開くように制限する必要があります。 –

+0

これに対して私はお勧めします。私はそのような種類のユーザーのやりとりを制限する方法は考えていません(ユーザーがブラウザで何をしているのかを簡単かつ確実に制御することはできません)。さらに、AJAXを使用する予定がある場合は、トークンをajax設定に追加しても、すぐにこれが解消されます。私は自分のプロジェクトで再生を続けます。 – Alex

+0

csrfハッシュは、サーバーにPOST要求が行われるまで変更されません。複数のタブ(フォーム付き)を開くことができ、それぞれが同じハッシュ値を持ちます。しかし、 '$ config ['csrf_regenerate'] = TRUE;' POST要求が行われるとハッシュが再生成され、以前に開いたタブは検証テストに失敗します。それ以外の@Alexあなたの答えとコメントにスポットがあります。 – DFriend

関連する問題