2012-04-09 11 views
4

Haben Sie erfolgreich die CSRF-Middleware in Express arbeiten, wie in früheren SO-Fragen. Es erzeugt die Token gut, aber es verweigert ALLE Formulareinreichungen. Der einzige mögliche Konflikt, den ich sehen kann, ist, dass ich redis als Session-Speicher mit connect-redis und dem Einstecken von socket.io in die Session benutze, aber ich habe die Socket-Bits auskommentiert und es spielt immer noch nicht gut.CSRF Middleware, die Probleme verursacht Node.JS + Express

Das ist die Reihenfolge, die ich meine Middleware anrufe, ist möglicherweise etwas verrückt hier?

(Coffee)

app.configure -> 
    app.set 'views', __dirname + '/views' 
    app.set 'view engine', 'jade' 
    app.use express.bodyParser() 
    app.use express.methodOverride() 
    app.use express.cookieParser() 
    app.use express.session 
     secret: "itsasecret" 
     store: sessionStore 
    app.use express.csrf() 
    app.dynamicHelpers 
     token: (req, res) -> 
     req.session._csrf 
    app.use app.router 
    app.use express.static(__dirname + '/public') 

Dies ist der Weg, der zu den gebuchten Daten reagiert.

(Dies ist nicht der Code-Entwicklung, mich nur zu lernen Knoten bin ich auch bewusst ist dies ein Monstrum sein würde, wenn ich es online gestellt)

app.post '/admin/logintry', (req, res) -> 
    if req.body.username is 'Tim' and req.body.password is 'TempPassword' 
     req.session.adminIn = true 
     res.redirect '/admin/home' 
    else 
     res.redirect '/admin/login?failed=true' 

Hier ist der HTML-Code, den Browser auf der Formularseite erreicht :

<input type="hidden" token="5ODFxml1QAhQvOmq1QE6Qd7n"> 

Und die Antwort empfangen von "/ admin/logintry":

Forbidden 

N ew zu Node, Express und SO, erst vor kurzem richtig erlerntes Javascript, unsicher, wo man überhaupt nach Problemen sucht. Irgendwelche Hilfe, sogar gerade auf wo man anfängt zu graben, sehr geschätzt.

Prost.

Antwort

4

Wenn man sich die Connect - csrf documentation aussehen, die input Tag für das Token sollte wie folgt aussehen:

<input type="hidden" name="_csrf" value="{token}" /> 

So mit Ihrem Beispiel token:

<input type="hidden" name="_csrf" value="5ODFxml1QAhQvOmq1QE6Qd7n" /> 

Aktuell Connect (Express verwendet Connect unter der hood) versucht, das Feld mit dem Namen "_csrf" zu finden, kann es aber nicht finden, weil es in Ihrer Form nicht existiert. Daher verbietet es den Zugriff.

+0

Alles funktioniert jetzt. Nannte den Namen, wenn er auf der vorhergehenden Frage reparierte. Danke für die schnelle Antwort! –

Verwandte Themen