2016-07-12 5 views
0

나는 다음과 같은 설정으로/특급 응용 프로그램 내 nodejs에서 CSRF 보호를 내장 : express/nodejs에서 여러 탭을 사용하여 csrf를 처리 할 때 발생하는 문제를 해결하는 방법은 무엇입니까?

var app = express(), 
    cookieParser = require('cookie-parser'), 
    session = require('express-session'), 
    csrf = require('csurf'); 

app.use(cookieParser()); 
app.use(session({ 
    , saveUninitialized: true 
    , resave: true 
    , store: new MongoStore() 
})); 

app.use(flash()); 

그리고 다음 로그인 양식

:

<form action="/process" method="POST"> 
    <input type="hidden" name="_csrf" value="{{csrfToken}}"> 
    <button type="submit">Submit</button> 
</form> 

사용자가 두 개의 브라우저 탭과 끝을 열고 문제의 arives을 이야기는 this line에서 EBADCSRFTOKEN 오류가 있습니다 :

:

은의 다음과 같은 경우를 보자

  1. 사용자가 두 개의 개별 탭에서 위의 양식을 엽니 다.
  2. 첫 번째 탭에서 그는 로그 아웃하고 다시 로그인합니다.
  3. 그런 다음 두 번째 탭으로 전환하고 제출을 클릭하여 EBADCSRFTOKEN 오류가 발생합니다.

은 내가 logout 경로 내 세션을 파괴하는 것을 가리 키도록해야합니다

app.route('/auth/signout') 
    .get(function (req, res, next) { 

     return req.session.destroy(function (err) { 
      if (err) return next(err); 

      return res.redirect('/'); 
     }); 
    }); 

나는 내가 거기에 저장하는 것도 중요한 비밀을 파괴하는 세션을 파괴한다는 사실 때문입니다. 따라서이 파괴로 인해 두 번째 탭에 유효하지 않은 토큰이 생기고 EBADCSRFTOKEN 오류가 발생합니다.

어떻게 든이 문제를 해결해야합니다. 이 사건에서 당신은 무엇을합니까? 페이지를 새로 고침하거나 페이지를 자동으로 다시로드하려면 팝업 표시?

+0

왜 GET으로 세션을 파괴하고 있습니까? 로그 아웃을위한'POST' 핸들러를 생성하고 사용자가'/ auth/signout'을 아무렇지도 않게 방문하지 않을 때 폼을 게시 할 때 세션을 파괴합니다. –

+0

예 할 수 있습니까? 그러나 이것은 나의 초기 prolem을 resovle하지 않는다 – Erik

+0

그리고 그 이유는 해답이 아니라. : D –

답변

1

양식 제출 전에 쿠키에서 csrf 토큰을 설정하고 검색해야합니다. 예를 들어, csrf C1으로 tabA를여십시오. tab2를 열면 csrf가 C2으로 변경됩니다. 그러나 쿠키에 쿠키가 설정되어있는 경우 tabA의 쿠키에서 csrf를 가져 오면 C2이 csrf 토큰이됩니다.

같은 일은 session-> logout-> new_session으로 결론 지을 수 있습니다. 쿠키에서 모든 것을 저장하고 가져옵니다. tab2에서 로그 아웃 한 후 로그인했기 때문에 tab1에는 tab2의 쿠키와 csrf 토큰이 있습니다.

+0

대답 주셔서 감사하지만 secutiry 어때? 보안상의 이유로 세션에 저장하는 것보다 토큰을 저장하는 것이 나쁜가? – Erik

+0

아니요, 양방향 저장 장치입니다. 쿠키 및 연관된 csrf 토큰의 복사본은 서버에 저장되어 저장됩니다. 따라서 클라이언트가 보낼 때 조합은 항상 확인됩니다. 따라서 그것은 안전합니다! – kawadhiya21

+0

좋아,하지만 당신의 문구에 동의하지 않습니다 :'당신이 csrf C1로 tabA를여십시오. tab2를 열면 csrf가 C2'로 변경됩니다. csurf 모듈에서 비밀은 https://github.com/pillarjs/csrf/blob/master/index.js#L105의 토큰을 생성하기 때문에 'C2'도 유효하기 때문에 이것은 문제가되지 않습니다. – Erik