Node.js
Node.js अनुप्रयोगों को सुरक्षित करना
खोज…
क्रॉस साइट अनुरोध को रोकना (CSRF)
CSRF एक ऐसा हमला है जो उपयोगकर्ता को एक वेब एप्लिकेशन पर अवांछित कार्यों को निष्पादित करने के लिए मजबूर करता है जिसमें वह वर्तमान में प्रमाणित होता है।
ऐसा इसलिए हो सकता है क्योंकि कुकीज़ को किसी वेबसाइट पर हर अनुरोध के साथ भेजा जाता है - तब भी जब वे अनुरोध किसी अन्य साइट से आते हैं।
हम csurf
मॉड्यूल का उपयोग csurf
टोकन बनाने और इसे मान्य करने के लिए कर सकते हैं।
उदाहरण
var express = require('express')
var cookieParser = require('cookie-parser') //for cookie parsing
var csrf = require('csurf') //csrf module
var bodyParser = require('body-parser') //for body parsing
// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })
// create express app
var app = express()
// parse cookies
app.use(cookieParser())
app.get('/form', csrfProtection, function(req, res) {
// generate and pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
app.post('/process', parseForm, csrfProtection, function(req, res) {
res.send('data is being processed')
})
इसलिए, जब हम GET /form
उपयोग करते हैं, तो यह व्यू के लिए csrf टोकन csrfToken
पास करेगा।
अब, दृश्य के अंदर, csrfToken मान को _csrf
नामक एक छिपे हुए इनपुट फ़ील्ड के मान के रूप में सेट करें।
उदाहरण के लिए handlebar
टेम्प्लेट
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
Name: <input type="text" name="name">
<button type="submit">Submit</button>
</form>
उदाहरण के लिए jade
टेम्पलेट
form(action="/process" method="post")
input(type="hidden", name="_csrf", value=csrfToken)
span Name:
input(type="text", name="name", required=true)
br
input(type="submit")
उदाहरण के लिए ejs
टेम्पलेट
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
Name: <input type="text" name="name">
<button type="submit">Submit</button>
</form>
Node.js में SSL / TLS
यदि आप अपने Node.js एप्लिकेशन में SSL / TLS को हैंडल करना चुनते हैं, तो विचार करें कि आप इस बिंदु पर SSL / TLS हमले की रोकथाम को बनाए रखने के लिए भी जिम्मेदार हैं। कई सर्वर-क्लाइंट आर्किटेक्चर में, एसएसएल / टीएलएस एक रिवर्स प्रॉक्सी पर समाप्त होता है, दोनों आवेदन की जटिलता को कम करने और सुरक्षा कॉन्फ़िगरेशन के दायरे को कम करने के लिए।
यदि आपका Node.js एप्लिकेशन एसएसएल / टीएलएस को संभालना चाहिए, तो इसे कुंजी और प्रमाणित फ़ाइलों को लोड करके सुरक्षित किया जा सकता है।
यदि आपके प्रमाणपत्र प्रदाता को प्रमाणपत्र प्राधिकारी (CA) श्रृंखला की आवश्यकता होती है, तो इसे सरणी के रूप में ca
विकल्प में जोड़ा जा सकता है। किसी एकल फ़ाइल में एकाधिक प्रविष्टियों वाली श्रृंखला को कई फ़ाइलों में विभाजित किया जाना चाहिए और उसी क्रम में सरणी में दर्ज किया जाना चाहिए क्योंकि Node.js वर्तमान में एक फ़ाइल में एकाधिक ca प्रविष्टियों का समर्थन नहीं करता है। 1_ca.crt
और 2_ca.crt
फ़ाइलों के लिए नीचे दिए गए कोड में एक उदाहरण दिया गया है। यदि ca
सरणी की आवश्यकता है और ठीक से सेट नहीं है, तो क्लाइंट ब्राउज़र उन संदेशों को प्रदर्शित कर सकते हैं जो वे प्रमाण पत्र की प्रामाणिकता को सत्यापित नहीं कर सकते हैं।
उदाहरण
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('privatekey.pem'),
cert: fs.readFileSync('certificate.pem'),
ca: [fs.readFileSync('1_ca.crt'), fs.readFileSync('2_ca.crt')]
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
HTTPS का उपयोग करना
Node.js में एक HTTPS सर्वर के लिए न्यूनतम सेटअप कुछ इस तरह होगा:
const https = require('https');
const fs = require('fs');
const httpsOptions = {
key: fs.readFileSync('path/to/server-key.pem'),
cert: fs.readFileSync('path/to/server-crt.pem')
};
const app = function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}
https.createServer(httpsOptions, app).listen(4433);
यदि आप भी http अनुरोधों का समर्थन करना चाहते हैं, तो आपको बस यह छोटा संशोधन करने की आवश्यकता है:
const http = require('http');
const https = require('https');
const fs = require('fs');
const httpsOptions = {
key: fs.readFileSync('path/to/server-key.pem'),
cert: fs.readFileSync('path/to/server-crt.pem')
};
const app = function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}
http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
एक HTTPS सर्वर की स्थापना
एक बार जब आप अपने सिस्टम पर नोड.जेएस स्थापित कर लेते हैं, तो बस एचटीटीपी और एचटीटीपी दोनों के समर्थन के साथ चलने वाले एक मूल वेब सर्वर प्राप्त करने के लिए नीचे दी गई प्रक्रिया का पालन करें!
चरण 1: एक प्रमाणपत्र प्राधिकरण बनाएँ
वह फ़ोल्डर बनाएँ जहाँ आप अपनी कुंजी और प्रमाणपत्र संग्रहीत करना चाहते हैं:
mkdir conf
उस निर्देशिका पर जाएं:
cd conf
कॉन्फ़िगरेशन शॉर्टकट के रूप में उपयोग करने के लिए इस
ca.cnf
फ़ाइल को पकड़ो:wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf
इस कॉन्फ़िगरेशन का उपयोग करके एक नया प्रमाणपत्र प्राधिकरण बनाएं:
openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem
अब हमारे पास
ca-key.pem
औरca-cert.pem
में हमारे प्रमाणपत्र प्राधिकारी हैं, चलो सर्वर के लिए एक निजी कुंजी उत्पन्न करते हैं:openssl genrsa -out key.pem 4096
कॉन्फ़िगरेशन शॉर्टकट के रूप में उपयोग करने के लिए इस
server.cnf
फ़ाइल को पकड़ो:wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf
इस कॉन्फ़िगरेशन का उपयोग करके प्रमाणपत्र पर हस्ताक्षर करने का अनुरोध उत्पन्न करें:
openssl req -new -config server.cnf -key key.pem -out csr.pem
अनुरोध पर हस्ताक्षर करें:
openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem
चरण 2: अपने प्रमाणपत्र को मूल प्रमाणपत्र के रूप में स्थापित करें
अपने प्रमाणपत्र को अपने रूट प्रमाणपत्र के फ़ोल्डर में कॉपी करें:
sudo cp ca-crt.pem /usr/local/share/ca-certificates/ca-crt.pem
अद्यतन CA स्टोर:
sudo update-ca-certificates
सुरक्षित एक्सप्रेस .js 3 अनुप्रयोग
Express.js का उपयोग कर एक सुरक्षित कनेक्शन बनाने के लिए कॉन्फ़िगरेशन (संस्करण 3 के बाद से):
var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey = fs.readFileSync('sslcert/server.key', 'utf8');
var certificate = fs.readFileSync('sslcert/server.crt', 'utf8');
// Define your key and cert
var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var app = express();
// your express configuration here
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
// Using port 8080 for http and 8443 for https
httpServer.listen(8080);
httpsServer.listen(8443);
इस तरह आप देशी http / https सर्वर को एक्सप्रेस मिडलवेयर प्रदान करते हैं
यदि आप चाहते हैं कि आपका ऐप 1024 से नीचे के पोर्ट पर चल रहा हो, तो आपको sudo कमांड (अनुशंसित नहीं) का उपयोग करना होगा या रिवर्स प्रॉक्सी (उदा nginx, haproxy) का उपयोग करना होगा।