5

私はヘッダー値を取得しようとしています:

Request::header('csrf_token')

ただし、私の firebug は、csrf_token が に設定されていることをヘッダーに示していbaMDpF0yrfRerkdihFack1Sa9cchUk8qBzm0hK0Cます。実際、csrf_token代わりにネイティブ php コードを使用して取得できます。

getallheaders()['csrf_token']

ここで問題は、XSRF 保護を正しく行っているかどうかです。または、私が行ったphpコードに欠陥があり、バグのあるlaravel 4関数を実際に使用する必要がある

Request::header('csrf_token')

これは何も返しません。そして、私は何かを逃しました。おそらく私のLaravel 4構成などで?

PS: 私は AngularJS を使用していますが、どのクライアント側を使用してもかまわないかもしれません。ガイドとしてこのリンクがあります: Laravel API を使用して AngularJS フォーム内で csrf_token() を送信する方法は?

4

5 に答える 5

2

問題

Laravel は、Request::header()メソッドでヘッダーを取得するときに、名前にアンダースコアが含まれるヘッダーを削除しています。さらに、すべてのヘッダー名はメソッド内で小文字に変換されRequest::header()ます。

短い解決策

フロントエンドでは、ヘッダー名のすべてのアンダースコアをダッシュ​​に置き換えます。csrf_tokenになるcsrf-token

ロングソリューション

メインページ/レイアウトにLaravel CSRFトークンをAngular定数として追加します。

<script>
    angular.module("myApp").constant("CSRF_TOKEN", "<?php echo csrf_token(); ?>"); 
</script>

Angular のすべてのリクエストのデフォルト ヘッダーとしてトークンを追加します。

angular.module("myApp").run(function($http, CSRF_TOKEN){
    $http.defaults.headers.common["csrf-token"] = CSRF_TOKEN;
})

Laravel のcsrfフィルターで、入力ではなくヘッダーの一致をチェックします。

/**
 * Check that our session token matches the CSRF request header token.
 *
 * @return json
 */
Route::filter("csrf", function() {
    if (Session::token() !== Request::header("csrf-token")) {
        return Response::json(array(
            "error" => array(
                "code"    => "403",
                "message" => "Ah ah ah, you didn't say the magic word.",
            ),
        ));
    }
}
于 2015-01-20T23:14:57.700 に答える
2

問題は、使用したLaravel を使用して AngularJS フォーム内で csrf_token() を送信する方法の次の回答で、csrf_token が XMLHttpRequest のヘッダーではなく、フォーム自体で送信されることだと思います。

その後、laravel バックエンドで通常の入力フィールドとしてフィルタリングする必要があります。実際の例については、以下を参照してください。

Route::filter('csrf_json', function()
{
    if (Session::token() != Input::get('csrf_token'))
    {
        throw new Illuminate\Session\TokenMismatchException;
    }
});

アップデート

Angular でヘッダーを使用する場合は、次のように記述します。

$httpProvider.defaults.headers.common['Authorization'] = TOKEN;

XMLHttpRequests に新しいヘッダーを適用するため。次に、次のような生のphpでも簡単にキャッチできます。

$aHeaders = getallheaders();
if (Session::token() != $aHeaders['authorization']) etc.
于 2014-05-12T05:31:10.240 に答える
1

Request::header()確かにヘッダーの取得に使用されますが、トークンが設定されている場所を確認してください.CSRFトークンはLaravel によってセッションに配置するSession::token()必要があり、メソッドを介してアクセスできます。

クラスの呼び出しによって生成された HTML を見るとForm::、 という隠し要素が表示されます_token。これをセッションのトークンと比較する必要があります。Input::get('_token')他の着信 GET または POST 変数と同様に、を使用してアクセスできます。

...しかし、これらすべてが実際に必要なわけではありません。事前に定義された のCSRFフィルターを介して簡単に管理できるため、そのフィルターを目的のルートまたはルート グループに追加するfilters.phpだけで保護されます。取得する必要はありません。その詳細に。

于 2013-09-03T11:23:38.130 に答える
0

問題は、Laravel フレームワークで拡張された Symfony Request オブジェクトにあります。この github スレッドを参照してください

https://github.com/laravel/framework/issues/1655#issuecomment-20595277

あなたの場合の解決策は、カスタム http ヘッダーに X のプレフィックスを付けたい場合は、ヘッダー名を HTTP_CSRF_TOKEN または HTTP_X_CSRF_TOKEN に設定することです。

于 2013-10-30T00:50:41.783 に答える