Warum nicht verwenden session-ID als XSRF-token?

Warum Play Framework verwenden Sie [eine signierte version der session-id] als Cross-Site Request Forgery (XSRF/CSRF) Prävention-token, anstatt die session-ID selbst?

(Mit XSRF-Prävention token, ich meine, ein Magischer Wert, die aufgenommen werden müssen in eine form übertragen, die für die webapp zu akzeptieren, form.)

Wenn es einen Lauscher s/er feststellen, sowohl die XSRF-token und dem SID-cookie sowieso (?).

Wenn es eine XSS-exploit, dann wird der bösartige JavaScript-code kann sowohl die XSRF-token und dem SID-cookie (?).

Jedoch:

  1. Ein Angreifer kann nicht bauen eine gültige XSRF-token, da eine SID an, da er/Sie nicht über den geheimen Schlüssel, der verwendet wird, wenn die Unterzeichnung der SID zu erhalten, die XSRF-token. - Aber wie konnte es passieren, dass ein Angreifer bekommt halt nur die SID, nicht den XSRF-token? Ist das weit hergeholt?

  2. Wenn die SID gesendet wird in einem HTTP-cookie, dann kann ein Angreifer hätte nicht den SID auch wenn Sie/er die XSRF-token, und vielleicht ist der Angreifer muss wirklich die SID? -- Ist das weit hergeholt?

Code-snippets:

Hier Spielen Konstrukte es XSRF-token (getId gibt die session-ID):
(play/framework/src/play/mvc/Scope.java)

    public String getAuthenticityToken() {
        return Crypto.sign(getId());
    }

Hier Spielen überprüft, dass eine <form> hat eine gültige XSRF-token:
(play/framework/src/play/mvc/Controller.java)

protected static void checkAuthenticity() {
    if(Scope.Params.current().get("authenticityToken") == null ||
       !Scope.Params.current().get("authenticityToken").equals(
                       Scope.Session.current().getAuthenticityToken())) {
        forbidden("Bad authenticity token");
    }
}

Update:


Spielen hat sich verändert, wie es erzeugt XSRF-Token, jetzt die SID wird nicht mehr verwendet, stattdessen ein zufälliger Wert ist signiert und verwendet! (Ich habe gerade aktualisiert meine Play Framework Git repo clone von der alten Play-version 1.1 neu 1.2. Vielleicht sollte ich dies getan haben ... gestern, hmm.)

    public String getAuthenticityToken() {
        if (!data.containsKey(AT_KEY)) {
            data.put(AT_KEY, Crypto.sign(UUID.randomUUID().toString()));
        }
        return data.get(AT_KEY);
    }

Gut, dann warum haben Sie denn diese änderung?

Fand ich den commit:

[#669] Fix wieder und gelten für Flash und Fehler sowie

d6e5dc50ea11fa7ef626cbdf01631595cbdda54c

Vom Thema #669:

create session, nur wenn absolut notwendig

Ein session-cookie wird erstellt bei jeder Anforderung einer Ressource. spielen sollte nur eine session-cookie, wenn es wirklich die Daten in der session gespeichert.

So dass Sie mit einem zufälligen Wert, nicht der SID, da die SID noch nicht erstellt wurden. Auch das ist ein Grund, nicht zu verwenden, ein Derivat des SID als XSRF-token. Aber nicht klären, warum Sie unterschrieben/Hash die SID, in der Vergangenheit, wenn Sie wurden es zu benutzen.

InformationsquelleAutor KajMagnus | 2011-08-06
Schreibe einen Kommentar