나는 다음과 같은 설정으로/특급 응용 프로그램 내 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
오류가 있습니다 :
은의 다음과 같은 경우를 보자
- 사용자가 두 개의 개별 탭에서 위의 양식을 엽니 다.
- 첫 번째 탭에서 그는 로그 아웃하고 다시 로그인합니다.
- 그런 다음 두 번째 탭으로 전환하고 제출을 클릭하여
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
오류가 발생합니다.
어떻게 든이 문제를 해결해야합니다. 이 사건에서 당신은 무엇을합니까? 페이지를 새로 고침하거나 페이지를 자동으로 다시로드하려면 팝업 표시?
왜 GET으로 세션을 파괴하고 있습니까? 로그 아웃을위한'POST' 핸들러를 생성하고 사용자가'/ auth/signout'을 아무렇지도 않게 방문하지 않을 때 폼을 게시 할 때 세션을 파괴합니다. –
예 할 수 있습니까? 그러나 이것은 나의 초기 prolem을 resovle하지 않는다 – Erik
그리고 그 이유는 해답이 아니라. : D –