2012-11-22 29 views
11

पर कुछ अनुरोधों के लिए सीएसआरएफ सत्यापन अक्षम करें मैं एक्सप्रेस फ्रेमवर्क का उपयोग करके नोड.जेएस के साथ एक छोटा सा वेब ऐप लिख रहा हूं। मैं सीएसआरएफ मिडलवेयर का उपयोग कर रहा हूं, लेकिन मैं इसे कुछ अनुरोधों के लिए अक्षम करना चाहता हूं। इस प्रकार मैं इसे अपने ऐप में शामिल करता हूं:एक्सप्रेस

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()); 

मैं सीएसआरएफ नियंत्रण के बिना एक पोस्ट रूट सेट करना चाहता हूं।

उत्तर

26

कई संभावित दृष्टिकोण हैं। आपको मूल रूप से यह समझने की आवश्यकता है कि सीएसआरएफ मिडलवेयर का उपयोग करना है या नहीं, यह तय करने के लिए सबसे सरल और सबसे सही नियम क्या है। यदि आप अधिकांश समय सीएसआरएफ चाहते हैं, तो अनुरोध पैटर्न के छोटे श्वेतसूची को छोड़कर, 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

कृपया ध्यान दें कि यदि आप csurf का उपयोग करते हैं और express.csrf नहीं करते हैं, तो यह काम नहीं करेगा। Http://stackoverflow.com/questions/24992139/node-js-use-csurf-condically-with-express-4 –

1

dailyjs.com सीएसआरएफ और एक्सप्रेस के बारे में एक अच्छा लेख है। यह मूल रूप से इस तरह काम करता है:

उपयोग 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

सत्यापन 'एसएसआरएफ मिडलवेयर द्वारा 'POST' अनुरोधों पर किया जाता है। [डॉक्स] देखें (http://www.senchalabs.org/connect/csrf.html) – zemirco

+0

मुझे कुछ भी दिखाई नहीं देता है। मैं उम्मीद करता हूं कि अगर (टोकन == req.session।_csrf) कहीं। – chovy

2

के बाद से एक्सप्रेस मिडलवेयर क्रम में कार्यान्वित करता है, तो आप हमेशा अपने बयानों कोड में CSRF() बयान से ऊपर डाल सकता है।

इस तरह

:

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

एक्सप्रेस अपने CSRF टोकन सेट हो जाता है इससे पहले कि वापस आ जाएगी। एंडपॉइंट्स की बहुत छोटी संख्या के लिए (मेरे पास सिर्फ इस श्रेणी में फिट है), मुझे यह एक क्लीनर समाधान माना गया है।

इसके अलावा, इस लेखन के रूप में, इसके बाद के संस्करण जवाब के लिए कोड इस तरह दिखेगा:

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

app.use customCsrf 

अतिरिक्त (अनुरोध, रेस, बगल में) मुझे फिसल गया थोड़ी देर के लिए यही कारण है, इसलिए उम्मीद है कि इस में किसी को मदद मिलती है।

+0

फेंक देगा, मुझे लगता है कि उपयोगकर्ता को उसी वाक्यविन्यास में प्रतिक्रिया देने में मददगार होगा क्योंकि उन्होंने प्रश्न लिखा था। – unknowndomain