2012-11-22 56 views
11

我正在使用Express框架編寫一個帶有Node.js的小型Web應用程序。我正在使用csrf中間件,但我想爲某些請求禁用它。這是我如何將其包含在我的應用程序中:禁用Express的一些請求的csrf驗證

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()); 

我想設置一個POST路由而不使用csrf控件。

回答

26

有幾種可能的方法。您基本上需要了解決定是否使用csrf中間件的最簡單和最正確的規則。如果您大多數時間需要csrf,除了請求模式的小白名單外,請按照this answer I have about conditional logging middleware中的示例(爲方便起見,在下面複製)。

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); 

另一種方法可能只是在特定路徑上使用中間件,如app.post('/forms/*', express.csrf())。您只想找到一種富有表現力的方式,以便在中間件將被使用或不會被使用時進行清理。

+0

謝謝,你的代碼就是我正在尋找的 – Gpx

+0

謝謝!這幫了很多。 –

+0

請注意,如果您使用csurf而不express.csrf,這將無法正常工作。請參閱http://stackoverflow.com/questions/24992139/node-js-use-csurf-conditionally-with-express-4 –

1

dailyjs.com有一篇關於csrf和express的好文章。它基本上是這樣的:

使用CSRF中間件:

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

創建設置本地變量token到CSRF值自定義的中間件:

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

使用自定義的中間件在每個你想要的路線:

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

在你的表單中創建隱藏字段保存CSRF值:

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

你在哪裏實際驗證令牌? – chovy

+0

驗證由csrf中間件對'POST'請求​​完成。請參閱[docs](http://www.senchalabs.org/connect/csrf.html) – zemirco

+0

我什麼也沒看到。我期望如果(標記== req.session。_csrf)某處。 – chovy

2

由於快遞中間件,以便爲執行,你可以始終把代碼的CSRF()語句你上面的語句。

像這樣:在你的CSRF令牌被設置

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

Express將返回。對於非常少量的端點(我只有一個適合這個類別的端點),我發現這是一個更乾淨的解決方案。

此外,截至記者發稿,針對上述答案的代碼是這樣的:

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

app.use customCsrf 

這額外的(REQ,水庫,下一個)我絆倒了一段時間,所以希望這可以幫助別人。

+0

我認爲以與他們編寫問題相同的語法對用戶做出響應會很有幫助。 – unknowndomain

相關問題