2012-11-22 3 views
11

Sto scrivendo una piccola app Web con Node.js che utilizza il framework Express. Sto usando il middleware csrf, ma voglio disabilitarlo per alcune richieste. Ecco come includerlo nella mia app:Disabilitare la convalida csrf per alcune richieste su Express

var express = require('express'); 
var app = express(); 

app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.cookieSession({secret: 'secret'})); 
app.use(express.csrf()); 

Voglio impostare un percorso POST senza il controllo csrf.

risposta

26

Ci sono diversi approcci possibili. Fondamentalmente è necessario capire qual è la regola più semplice e corretta per decidere se utilizzare o meno il middleware csrf. Se si desidera csrf la maggior parte del tempo, ad eccezione di una piccola whitelist di modelli di richiesta, seguire l'esempio in this answer I have about conditional logging middleware (copiato di seguito per comodità).

var express = require("express"); 
var csrf = express.csrf(); 
var app = express.createServer(); 

var conditionalCSRF = function (req, res, next) { 
    //compute needCSRF here as appropriate based on req.path or whatever 
    if (needCSRF) { 
    csrf(req, res, next); 
    } else { 
    next(); 
    } 
} 

app.use(conditionalCSRF); 
app.listen(3456); 

Altri approcci potrebbero essere solo utilizzando il middleware su un certo percorso come app.post('/forms/*', express.csrf()). Vuoi solo trovare un modo espressivo per renderlo pulito quando il middleware sarà o non verrà utilizzato.

+0

Grazie, il tuo codice è proprio quello che stavo cercando – Gpx

+0

Grazie! Questo ha aiutato molto. –

+0

nota che se usi csurf e non express.csrf, questo non funzionerà. Vedi http://stackoverflow.com/questions/24992139/node-js-use-csurf-conditionally-with-express-4 –

1

dailyjs.com ha un buon articolo su csrf ed express. Funziona praticamente così:

uso il CSRF middleware:

app.configure(function() { 
    // ... 
    app.use(express.csrf()); 
    // .. 
}); 

creare un middleware personalizzato che imposta la variabile locale token al valore CSRF:

function csrf(req, res, next) { 
    res.locals.token = req.session._csrf; 
    next(); 
} 

usare il tuo middleware personalizzato in ogni percorso desiderato:

app.get('/', csrf, function(req, res) { 
    res.render('index'); 
}); 

nel modulo creare un nascosto campo che contiene il valore CSRF:

form(action='/contact', method='post') 
    input(type='hidden', name='_csrf', value=token) 
+0

dove convalidi effettivamente il token? La convalida – chovy

+0

viene eseguita dal middleware csrf nelle richieste 'POST'. vedi [docs] (http://www.senchalabs.org/connect/csrf.html) – zemirco

+0

non vedo nulla. Mi aspetterei se (token == req.session._csrf) da qualche parte. – chovy

2

Dal espresso middleware esegue in ordine, si può sempre mettere le dichiarazioni sopra l'istruzione CSRF() nel codice.

Ti piace questa:

app.get '/ping', (req, res) -> res.status(200).end() 
app.use csrf() 

espresso tornerà prima del tuo token CSRF viene impostata. Per un numero molto limitato di endpoint (ne ho solo uno che si adatta a questa categoria), ho trovato che questa è una soluzione più pulita.

Inoltre, a partire da questa scrittura, il codice per la risposta di cui sopra sarebbe simile a questa:

customCsrf = (req, res, next) -> 
    if req?.url isnt '/ping' 
    return csrf()(req, res, next) 
    else 
    return next() 

app.use customCsrf 

quel qualcosa in più (REQ, res, prossimi) mi sgambetto per un po ', quindi spero che questo aiuta qualcuno.

+0

Penso che sarebbe stato utile rispondere all'utente nella stessa sintassi con cui ha scritto la domanda. – unknowndomain