2013-10-24 145 views

回答

0

在該文的另一部分,作者解釋說,這暴露了一個「標記」屬性到您應該包含在隱藏的輸入字段中的所有模板。

注意到他玉石例如2號線:

form(action='/form',method='post') 
    input(type='hidden', name='_csrf', value=token) 
    label(for='color') Color: 
    input(type='text',name='color',size='50') 
    button(type='submit') Save 
+2

我的意思是,我應該在所有現有的表單中放入'input(type ='hidden',name ='_ csrf',value = token)'? –

7

一種選擇是一個隱藏的輸入字段添加到您的所有形式你提到。但根據上CSRF快遞文檔:

缺省值功能檢查由bodyParser()中間件產生req.body,通過query()產生req.query"X-CSRF-Token"報頭字段。

因此,根據您的客戶端框架,您也可以使用查詢字符串或X-CSRF-Token替代方案。

點仍然是你需要:

  • 通過從快速的_.csrf令牌提供給您的客戶端
  • 返回從客戶端的_.csrf令牌回到表達對您的所有狀態突變的REC t(POST/PUT/DELETE),Express可以將其與req.session._csrf進行比較以完成周期。

例如,如果您的客戶端是棱角分明,在$http模塊默認提供了CSRF保護,尋找一個cookie稱爲XSRF-TOKEN,並通過頭部上的所有狀態突變請求返回這個值(POST/PUT/DELETE)稱爲X-XSRF-TOKEN。這是一個不幸的巧合,因爲名稱不同於Express查找它的標題名稱,即X-CSRF-TOKEN(通知-XSRF--CSRF-)。

爲了克服這一點,你需要

步驟1:在快遞方面增加了CSRF中間件尋找在X-XSRF-TOKEN頭中的令牌值的默認值的功能,除了所有其他默認地方:

app.use(express.csrf({value: function(req) { 
    var token = (req.body && req.body._csrf) || 
     (req.query && req.query._csrf) || 
     (req.headers['x-csrf-token']) || 
     // This is the only addition compared to the default value function 
     (req.headers['x-xsrf-token']); 
    return token; 
    } 
}); 

步驟2:在快遞方面再次設置在cookie是角將尋找req.session._csrf下由CSRF中間件添加的令牌值,使用自定義的中間件:

app.use(function(req, res, next) { 
    req.cookie('XSRF-TOKEN', req.session._csrf); 
    next(); 
}); 

現在Angular會找到它,並將其包含在X-XSRF-TOKEN標題中,而無需採取任何進一步的操作。