2014-04-17 42 views
5

我想爲我的服務器端表單驗證寫一個測試,但我不斷收到Forbidden錯誤。看來這需要分兩步進行。步驟1,從表單中獲取CSRF值。第2步,使用CSRF值發佈到表單處理程序。然而,無論我如何發佈,我都會得到一個禁止的錯誤。如何使用CSRF測試快速表單發佈?

--full測試:https://github.com/socketwiz/swblog/blob/master/test/contact.js#L57-L100

我試圖改變正是如此下面一行: https://github.com/socketwiz/swblog/blob/master/test/contact.js#L85

.send({name: 'foo', 'X-CSRF-Token': token}) 

.set('X-CSRF-Token', token) 

.set('Cookie', ['X-CSRF-Token=' + token]) 

但沒有我嘗試將似乎滿足CSRF要求。我越嘗試越複雜,這似乎是一件簡單的事情。也許我正在談論這一切都是錯誤的。有任何想法嗎?

+0

這是否清楚什麼了? http://jb.demonte.fr/blog/expressjs-angularjs-csrf/ – adrichman

+0

@adrichman,我想我應該說它在我的表單中工作得很好,我只是無法弄清楚如何編寫測試它。當測試試圖發佈它時,無論我嘗試什麼,都會得到一個Forbidden錯誤:( – socketwiz

+0

我不確定您所引用的語法,但看起來您可能需要重構,以便專門設置'x- csrf-token'HEADER等於位於cookie上的令牌 – adrichman

回答

11

謝謝@shawnzhu,你對cookies的評論幫助我弄清楚我需要做什麼。我有一個想法,我過於複雜了。以下是我想出了:

https://github.com/socketwiz/swblog/blob/master/test/contact.js

it('should not post just a name', function(done) { 
    request(mock) 
     .get('/contact') 
     .end(function(err, res){ 
     var $html = jQuery(res.text); 
     var csrf = $html.find('input[name=_csrf]').val(); 

     request(mock) 
      .post('/api/contact.json') 
      .set('cookie', res.headers['set-cookie']) 
      .send({ 
      _csrf: csrf, 
      name: 'Mary Jane' 
      }) 
      .expect(function(res){ 
      assert.equal(undefined, res.body.name); 
      assert.equal('You must provide a valid email address', res.body.email); 
      assert.equal('You must provide a message', res.body.message); 
      }) 
      .expect(500, done); 
     }); 
}); 
+0

這實際上很棒,我只是無法弄清楚如何讓jQuery像這樣運行,我正在節點上運行測試並測試一個快速應用。所以我沒有一個完整的文檔結構 我添加了:var jQuery = require('jQuery'); 錯誤是:未捕獲錯誤:jQuery需要一個帶有文檔的窗口 – user2562923

+0

我認爲你需要一些東西像jsdom,檢查這個問題的答案:http://stackoverflow.com/questions/21358015/error-jquery-requires-a-window-with-a-document – socketwiz

+0

或者檢查一下如何更好地從cookie中獲取csrf標記:http://stackoverflow.com/questions/18773846/how-to-test-endpoints-protected-by-csrf-in-node-js-表現 – Wtower

2

Express csrf中間件保存會話中的密鑰以驗證csrf令牌,而我猜你使用cookieSession中間件作爲會話存儲。因此,當使用csrf令牌發送數據時,您需要重新發送會話cookie,express可以使用會話中的密碼來驗證您的csrf令牌。