9

私は実際に Laravel 4 をいじっています。現在、フォーム ポストに CSRF トークン セキュリティを実装しています。

問題は、セッションで生成されたトークンが常に同じであるという意味で、これは実際には機能していないSession::token()ため、フォームを再送信しようとしたり、別のサーバーからフォームを投稿しようとすると、セキュリティチェックが機能しないことですSession::token() != Input::get('_token')( filters.php)

すでにこの問題に直面している人はいますか?

編集:
わかりました、これの説明を見つけました。トークンは、実際にはマシン/セッションごとに異なります。今ではもっと理にかなっています:)助けてくれたみんなに感謝します

4

4 に答える 4

9

フォームが送信されたら、フォームを処理した後、Session::put('_token', md5(microtime()));このように CSRF トークンを変更して、フォームの再送信から保護する必要があります。詳細については、これこれを参照してください。

于 2013-08-23T10:02:50.283 に答える
3

app/filter.php で組み込みの regenerateToken 関数を次のように使用します。

Route::filter('csrf', function()
{
    if (Session::token() != Input::get('_token'))
    {
        Session::regenerateToken();
        return *Redirect / Exception*
    }
    Session::regenerateToken();
});

入力でリダイレクトする場合のもう 1 つの注意事項です。

laravel 4 では、 {{ Form::open(...) }} を次のように使用すると、トークンが生成されます。

public function token()
{
    return $this->hidden('_token', $this->csrfToken);
}

そのため、存在する場合は Input::old 関数から値を設定する非表示の入力を使用します。

これを防ぐには、次のように既に古いトークンを使用してフォームを作成したくない場合は、Input::except('_token') を使用する必要があります。

return Redirect::route('routename')->withInput(Input::except('_token'));
于 2014-05-25T10:32:50.063 に答える
1

フォーム内で、次のようにトークンを作成する必要があります。

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

その後、トークンが入力とともに送信されます。したがって、入力を受け取ったら、次のようにトークンを確認する必要があります。

Route::post('register', array('before' => 'csrf', function()
{
    return 'You gave a valid CSRF token!';
}));

このようにして、ルートにアクセスする前に、CSRF トークンをチェックするフィルターを配置します。

こちらのLaravelのドキュメントからこれを入手しまし

于 2013-08-22T13:53:45.207 に答える
0

Blade を使用してフォームを作成すると、フォーム内に _token が自動的にレンダリングされます

<?php echo Form::open(array('url' => '/', 'files' => true, 'id' => 'shareForm', 'method' => 'post')) ?>
...
HTML
...
 <?php echo Form::close() ?>
于 2015-04-17T23:17:56.143 に答える