2

奇妙な問題を発見しました。トルネードを使用してサイトを実行し、トルネード POST で _xsrf パラメータが必要です。jQuery バージョン 1.7.2 を使用すると、次のコードは正常に機能しましたが、ブラウザーを再度開くと POST 403 エラーが発生します (Cookie を保持)生きている) jQuery をバージョン 1.8.3 に変更した後...しかし、1.7.2 以前は正常に動作します...

tornado の 403 は、_xsrf が正しくないことを意味します。ポイントは、ブラウザを再度開くと 403 エラーが発生することです。まだログインしていますが、POST できません。

誰でも問題を知っていますか?以下はコードです

        function getCookie(name) {
                var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
                return r ? r[1] : undefined;
        }

        jQuery.postJSON = function(url, args, callback) {
                    args._xsrf = getCookie("_xsrf");
                    $.ajax({
                                url: url, data: $.param(args), dataType: "text", type: "POST", async: true,
                                success: function(response) {
                                    if (callback) callback(eval("(" + response + ")"));
                                }, 
                                error: function(response) {
                                    try{
                                        args._xsrf = getCookie("_xsrf");
                                        $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST", async: true,
                                            success: function(response) {
                                                if (callback) callback(eval("(" + response + ")"));
                                            }
                                        });
                                    }
                                    catch(e){

                                    }
                                }
                    });
        };
4

1 に答える 1

3

私は同じ問題を抱えていました。何らかの理由で、ブラウザーの再起動後に '_xsrf' 値が Cookie から削除されます。問題は、トルネードがこの Cookie を再度設定しないのはなぜですか? トルネード コード (web.py) を見ると、次のようになります。

    token = (self.get_argument("_xsrf", None) or
             self.request.headers.get("X-Xsrftoken") or
             self.request.headers.get("X-Csrftoken"))
    if not token:
        raise HTTPError(403, "'_xsrf' argument missing from POST")
    if self.xsrf_token != token:
        raise HTTPError(403, "XSRF cookie does not match POST argument")

リクエストのどこにも _xsrf が見つからない場合、リクエストはすぐに拒否されることがわかります。新しい Cookie 値が次の行に設定されます

    if self.xsrf_token != token:

それには達していません (self.xsrf_token は @property でラップされた関数です)。

したがって、最も簡単な回避策は次のとおりです。

  1. 関数 getCookie を変更して、_xsrf が Cookie に見つからない場合に何らかの文字列を返すようにします。たとえば、「not_found」:

    function getCookie(name) {
        var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
        if (!r && name == "_xsrf"){
            return 'not_found'
        }
        return r ? r[1] : undefined;
    }
    
  2. これで、最初の不正なリクエストの後、tornado は _xsrf Cookie を設定します。そして 2 番目のリクエストはパスする

別の解決策:

tornado でページをレンダリングするたびに、self.xsrf_tokenリクエスト ハンドラでプロパティをヒットします。「_xsrf」Cookie が設定されていることを確認してください。

于 2013-01-29T18:04:39.623 に答える