2012-11-22 2 views
11

Express 프레임 워크를 사용하여 Node.js로 작은 웹 응용 프로그램을 작성하고 있습니다. csrf 미들웨어를 사용하고 있지만 일부 요청에 대해서는 비활성화하려고합니다. 이것은 내 응용 프로그램에 포함하는 방법입니다 :Express에서 일부 요청에 대해 csrf 유효성 검사 사용 안 함

var express = require('express'); 
var app = express(); 

app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.cookieSession({secret: 'secret'})); 
app.use(express.csrf()); 

csrf 컨트롤없이 POST 경로를 설정하려고합니다.

답변

26

몇 가지 가능한 접근법이 있습니다. 기본적으로 csrf 미들웨어를 사용할지 여부를 결정하는 가장 단순하고 올바른 규칙은 무엇인지 이해해야합니다. 요청 패턴의 작은 화이트리스트를 제외하고 대부분의 경우 csrf를 원하면 this answer I have about conditional logging middleware (편의를 위해 아래에 복사 됨)의 예를 따르십시오.

var express = require("express"); 
var csrf = express.csrf(); 
var app = express.createServer(); 

var conditionalCSRF = function (req, res, next) { 
    //compute needCSRF here as appropriate based on req.path or whatever 
    if (needCSRF) { 
    csrf(req, res, next); 
    } else { 
    next(); 
    } 
} 

app.use(conditionalCSRF); 
app.listen(3456); 

또 다른 방법은 app.post('/forms/*', express.csrf()) 같은 특정 경로에 미들웨어를 사용하여이 될 수 있습니다. 미들웨어가 사용되거나 사용되지 않을 때 깨끗하게 표현할 수있는 방법을 찾고 싶을뿐입니다.

+0

감사합니다. 코드는 내가 찾고있는 코드입니다. – Gpx

+0

고마워요! 이것은 많은 도움이되었습니다. –

+0

express.csrf가 아닌 csurf를 사용하면이 기능이 작동하지 않습니다. http://stackoverflow.com/questions/24992139/node-js-use-csurf-conditionally-with-express-4를 참조하십시오. –

1

dailyjs.com에는 csrf 및 표현에 대한 좋은 기사가 있습니다. 그것은 기본적으로 다음과 같이 작동

사용 CSRF 미들웨어 :

function csrf(req, res, next) { 
    res.locals.token = req.session._csrf; 
    next(); 
} 

마다에서 사용자 정의 미들웨어를 사용

app.configure(function() { 
    // ... 
    app.use(express.csrf()); 
    // .. 
}); 

은 CSRF 값으로 지역 변수 token을 설정하는 사용자 정의 미들웨어를 만들 당신이 원하는 경로 :

app.get('/', csrf, function(req, res) { 
    res.render('index'); 
}); 

양식에 숨겨진 CSRF 값을 보유 필드 : 익스프레스 미들웨어 순서대로 실행

form(action='/contact', method='post') 
    input(type='hidden', name='_csrf', value=token) 
+0

실제로 토큰의 유효성을 검사합니까? – chovy

+0

유효성 검사는 csrf 미들웨어에 의해'POST' 요청에 의해 수행됩니다. [docs] (http://www.senchalabs.org/connect/csrf.html) – zemirco

+0

아무 것도 보이지 않습니다.를 참조하십시오. 내가 기대하는 경우 (토큰 == req.session._csrf) 어딘가에 있습니다. – chovy

2

때문에, 당신은 항상 코드에서 CSRF() 문 위의 문을 넣을 수 있습니다. 이처럼

: 당신의 CSRF 토큰이 설정되기 전에

app.get '/ping', (req, res) -> res.status(200).end() 
app.use csrf() 

Express가 반환됩니다. 매우 적은 수의 엔드 포인트 (이 카테고리에 맞는 제품 만 있습니다)의 경우이 제품이 더 깨끗한 솔루션이라는 것을 알게되었습니다.

또한,이 글을 쓰는 등, 위의 답변에 대한 코드는 다음과 같을 것이다 :

customCsrf = (req, res, next) -> 
    if req?.url isnt '/ping' 
    return csrf()(req, res, next) 
    else 
    return next() 

app.use customCsrf 

여분의 (REQ, 고해상도, 다음)는 잠시 나를 넘어, 그래서이 사람을 도움이되기를 바랍니다있다.

+0

이 던져 질 것입니다. 사용자가 질문을 쓴 것과 같은 구문으로 응답하는 것이 도움이되었을 것입니다. – unknowndomain

관련 문제