2017-02-05 23 views
6

最近のバージョンのLaravel(正しく)では、セッションをログアウトするためにPOSTが使用されています。この理由は、GET/HEADは受動アクションがHTTPに準拠するためにのみ使用されるべきであるということです。 POSTをトリガする(ただし https://security.stackexchange.com/questions/62769/must-login-and-logout-action-have-csrf-protectionLaravel 5.xで期限切れのセッションをログアウトするにはどうすればよいですか?

セッションが既にタイムアウトした場合、ユーザーがログアウトをクリック:CSRFトークンと

投稿はまたあなたのセッションのうち、あなたがログインし、悪意のあるユーザ/サイトを保護しますログアウト経路に)、トークン不一致エラーが受信される。セッションが期限切れになったため、トークンが一致しません。

要求変数に基づいてその特定のTokenMismatchExceptionを捕まえることができます。もしそうなら、それらをメリー法(ログアウトされたリダイレクトパス、 "home"または "/")で続行してください。このように:

public function render($request, Exception $e) 
{ 
    if ($e instanceof TokenMismatchException && $request->getRequestUri() === '/logout') { 
     return redirect('/'); 
    } 

    return parent::render($request, $e); 
} 

私の質問は次のとおりです。私は上記の操作を行う場合は、最初の場所でのトークンのポイントは何ですか?また、CSRFトークンでPOSTログアウトを使用する目的の結果を維持しながら、セッションが終了したときにユーザーをログアウトする方法はありますか?

+0

ログアウトを保護する必要がある場合:http://security.stackexchange.com/questions/62769/must-login-and-logout-action-have-csrf-protection/62797 あなたの質問に答えるには、私に情報を与えてください、どのような機構がセッションをタイムアウトしていますか? – Mkay1

+0

@ Mkay1は、あらゆる種類のタイムアウト(セッションのタイムアウト、セッションの破棄など)を想定しています。あなたが提供したリンクは私の質問にリンクされている同じです – Chris

答えて

3

認証をチェックするミドルウェアは、CSRFトークンの有効性をチェックするミドルウェアの前に実行する必要があります。

このように、セッションが期限切れになった場合、認証ミドルウェアでセッションの有効期限がすでにチェックされているため、そこのログインページへのリダイレクトが完了しているため、CSRFチェックが最初に行われることはありません。

有効なセッションのCSRF保護には影響しません。これは、有効なセッションが認証ミドルウェアによって行われるためです。

デフォルトでは、LaravelミドルウェアはCSRFチェックを最初に実行します。しかし、それを逆順に並べ替えることは容易ではありません。

+0

それは実際にはたくさんの意味があります。私はauth用のデフォルトルートを使用していますが、すべては認証ミドルウェアの外に(デフォルトで)置いていますが、Webミドルウェア内に座っています。私は彼らの周りにシャッフルを与え、あなたの答えがあれば戻ってきます。なぜ、デフォルトの動作がログアウトルートが認証ミドルウェアの外にあるのか不思議です – Chris

+0

デフォルトの動作は、ログアウトルートが認証ミドルウェア外にあることではありません。認証ルートの認証ミドルウェアはデフォルトで認証コントローラのコンストラクタに設定されているため、ミドルウェアの正規リストの後に実行されます。 –

+0

ああ、私はコントローラーレベルのミドルウェアに交換したことがないので、tbhが存在することを忘れてください。私は、ルートレベルまたはルートプロバイダーレベルのミドルウェアのみを使用します。より一貫性があり、目に見えます。 – Chris

関連する問題