2014-04-17 1 views
5

서버 쪽 양식 유효성 검사를위한 테스트를 작성하려고하지만 금지 된 오류가 계속 발생합니다. 이것이 2 단계 과정이어야 할 필요가있는 것 같습니다. 1 단계, 양식에서 CSRF 값을 얻습니다. 2 단계, CSRF 값을 사용하여 양식 처리기에 게시하십시오. 그러나 내가 어떻게 게시하려고해도 금지 된 오류가 발생합니다.CSRF로 익스프레스 양식 게시를 테스트하는 방법은 무엇입니까?

--full 테스트 : 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의 요구 사항을 만족하는 것 없습니다 : https://github.com/socketwiz/swblog/blob/master/test/contact.js#L57-L100

내가 thusly 히 다음 줄을 변경 시도했습니다. 더 복잡한 것을 시도할수록 이것은 단순한 것처럼 보입니다. 어쩌면 나는이 모든 잘못을 범할지도 모른다. 어떤 아이디어?

+0

이 명확 무엇을합니까 : 여기에 내가 무엇을 최대 온입니까? http://jb.demonte.fr/blog/expressjs-angularjs-csrf/ – adrichman

+0

@adrichman, 내 양식에서 정상적으로 작동한다고 말했어 야합니다. 테스트를 작성하는 방법을 알 수 없습니다. 그것. 테스트가 게시하려고 시도 할 때 내가 무엇을하려고해도 Forbidden 오류가 발생합니다. ( – socketwiz

+0

당신이 참조하는 구문에 대해서는 확실하지 않지만 리 팩터가 필요할 수도 있으므로 'x- csrf-token '쿠키에있는 토큰과 동등한 HEADER – adrichman

답변

11

감사합니다. @shawnzhu, 쿠키에 대한 의견을 듣고 내가해야 할 일을 파악하는 데 도움이되었습니다. 내가 그것을 복잡하게 만들었다는 생각이 들었다.

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

또는 쿠키에서 csrf 토큰을 얻는 방법을 확인하십시오. http://stackoverflow.com/questions/18773846/how-to-test-endpoints-protected-by-csrf-in-node-js- 표하다 – Wtower

2

express csrf 미들웨어는 세션 저장소에 cookieSession 미들웨어를 사용하는 동안 csrf 토큰의 유효성을 검사하기 위해 세션에 비밀을 저장합니다. 그래서 POST가 csrf 토큰으로 데이터를 보낼 때 세션 쿠키를 다시 보내야합니다. 익스프레스는 세션의 비밀을 사용하여 csrf 토큰의 유효성을 검사 할 수 있습니다.

관련 문제