2014-04-17 12 views
5

Tôi đang cố gắng viết một kiểm tra để xác thực biểu mẫu phía máy chủ của mình nhưng tôi vẫn gặp phải lỗi Cấm. Có vẻ như điều này cần phải là một quá trình 2 bước. Bước 1, có được giá trị CSRF từ biểu mẫu. Bước 2, sử dụng giá trị CSRF để đăng lên trình xử lý biểu mẫu. Tuy nhiên không có vấn đề làm thế nào tôi cố gắng đăng bài tôi nhận được một lỗi bị cấm.Làm cách nào để kiểm tra bài đăng biểu mẫu nhanh với CSRF?

kiểm tra --full: https://github.com/socketwiz/swblog/blob/master/test/contact.js#L57-L100

tôi đã cố gắng thay đổi dòng sau thusly: 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]) 

Nhưng không có gì tôi cố gắng sẽ có vẻ để đáp ứng các yêu cầu CSRF. Tôi càng cố gắng phức tạp hơn này được cho những gì có vẻ như một điều đơn giản. Có lẽ tôi đang đi về tất cả điều này sai. Bất kỳ ý tưởng?

+0

Liệu bất cứ điều gì rõ ràng này lên? http://jb.demonte.fr/blog/expressjs-angularjs-csrf/ – adrichman

+0

@adrichman, tôi đoán tôi nên nói rằng nó hoạt động tốt từ hình thức của tôi, tôi chỉ không thể tìm ra cách để viết một bài kiểm tra cho nó. Khi thử nghiệm cố gắng đăng nó bị lỗi Cấm bất kể tôi cố gắng gì: ( – socketwiz

+0

Tôi không chắc chắn về cú pháp bạn đang tham chiếu, nhưng có vẻ như bạn có thể cần phải cấu trúc lại để bạn đặc biệt thiết lập 'x- csrf-token 'HEADER bằng mã thông báo nằm trên cookie – adrichman

Trả lời

11

Cảm ơn @shawnzhu, bạn nhận xét về cookie đã giúp tôi tìm ra những gì tôi cần làm. Tôi đã có một ý tưởng rằng tôi đã quá phức tạp nó. Dưới đây là những gì tôi đã đưa ra:

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

Điều này thực sự tuyệt vời.Tôi không thể tìm ra cách để jQuery chạy như thế này. Tôi đang chạy các kiểm tra trên nút và thử nghiệm một ứng dụng tốc hành. . Vì vậy, tôi không thực sự có một cấu trúc tài liệu đầy đủ tôi nói thêm: var jQuery = require ('jQuery'); Lỗi là: của router Lỗi: jQuery đòi hỏi một cửa sổ với một tài liệu – user2562923

+0

tôi nghĩ rằng bạn cần phải yêu cầu một cái gì đó như jsdom, hãy kiểm tra câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/21358015/error-jquery-requires-a-window-with-a-document – socketwiz

+0

Hoặc kiểm tra điều này về cách lấy mã thông báo csrf ra khỏi cookie tốt hơn: http://stackoverflow.com/questions/18773846/how-to-test-endpoints-protected-by-csrf-in-node-js- bày tỏ – Wtower

2

Phần mềm trung gian csrf nhanh tiết kiệm bí mật trong phiên để xác thực mã thông báo csrf, trong khi tôi đoán bạn sử dụng phần mềm trung gian cookieSession làm cửa hàng phiên. Vì vậy, bạn cần phải gửi lại cookie phiên khi POST dữ liệu bằng mã thông báo csrf, Express có thể sử dụng bí mật trong phiên để xác thực mã thông báo csrf của bạn.

Các vấn đề liên quan