जावास्क्रिप्ट एप्लिकेशन सुरक्षा: शुरुआती लोगों के लिए शीर्ष 10 कमजोरियाँ
वेब एप्लिकेशन सुरक्षा किसी भी डेवलपर के लिए सबसे महत्वपूर्ण विषयों में से एक है। जावास्क्रिप्ट (विशेषकर सर्वर साइड Node.js पर) अपनी लोकप्रियता के कारण अक्सर हमलावरों का निशाना बनता है। इस लेख में हम 10 सबसे सामान्य कमजोरियों पर चर्चा करेंगे जिनका सामना शुरुआती डेवलपर्स करते हैं, और दिखाएंगे कि उनसे कैसे बचा जाए।
1. XSS (क्रॉस-साइट स्क्रिप्टिंग)
XSS सबसे आम हमलों में से एक है, जहाँ हमलावर एक वेब पेज में दुर्भावनापूर्ण स्क्रिप्ट डालता है। ऐसा तब होता है जब उपयोगकर्ता से डेटा बिना एस्केप किए HTML में डाला जाता है।
खतरनाक कोड (कमजोर):
app.get('/search', (req, res) => { const query = req.query.q; res.send(`<h1>खोज परिणाम: ${query}</h1>`);});सुरक्षित कोड (सुरक्षा):
const escapeHtml = require('escape-html');
app.get('/search', (req, res) => { const query = escapeHtml(req.query.q); res.send(`<h1>खोज परिणाम: ${query}</h1>`);});2. SQL-इंजेक्शन
यदि आप SQL डेटाबेस (जैसे SQLite या PostgreSQL) का उपयोग करते हैं, तो बिना एस्केप किए गए क्वेरी डेटा लीक का कारण बन सकते हैं।
खतरनाक कोड:
const user = req.body.username;db.query(`SELECT * FROM users WHERE name = '${user}'`);सुरक्षित कोड (पैरामीटराइज्ड क्वेरी का उपयोग करें):
const user = req.body.username;db.query('SELECT * FROM users WHERE name = $1', [user]);3. असुरक्षित डिसीरियलाइज़ेशन
असत्यापित डेटा पर JSON.parse() का उपयोग "prototype pollution" जैसे हमलों का कारण बन सकता है।
कमजोरी का उदाहरण:
const data = JSON.parse(req.body.jsonData);// यदि data में __proto__ है, तो यह Object के प्रोटोटाइप को बदल सकता हैसुरक्षा: पार्सिंग से पहले हमेशा डेटा को मान्य करें या fast-json-stable-stringify जैसी लाइब्रेरी का उपयोग करें।
4. इनपुट वैलिडेशन की कमी
उपयोगकर्ता के डेटा पर कभी भरोसा न करें। हमेशा डेटा के प्रकार, लंबाई और प्रारूप की जाँच करें।
// बुरा: सब कुछ स्वीकार करनाapp.post('/profile', (req, res) => { const { name, age } = req.body; // ...});
// अच्छा: मान्य करनाconst schema = { name: 'string', age: 'number' };if (typeof req.body.name !== 'string') throw new Error('अमान्य नाम');5. CSRF (क्रॉस-साइट रिक्वेस्ट फोर्जरी)
एक हमला जिसमें हमलावर उपयोगकर्ता को उस साइट पर एक अवांछित कार्रवाई करने के लिए मजबूर करता है जहाँ वह प्रमाणित है।
सुरक्षा: CSRF-टोकन का उपयोग करें।
const csrf = require('csurf');app.use(csrf({ cookie: true }));
app.get('/form', (req, res) => { res.render('form', { csrfToken: req.csrfToken() });});6. त्रुटियों के माध्यम से जानकारी का रिसाव
उपयोगकर्ता को कभी भी विस्तृत त्रुटि संदेश न दिखाएं — यह हैकर्स को आपके एप्लिकेशन की संरचना के बारे में जानकारी देता है।
बुरा:
app.use((err, req, res, next) => { res.status(500).send(err.stack); // कॉल स्टैक का रिसाव!});अच्छा:
app.use((err, req, res, next) => { console.error(err.stack); // अपने लिए लॉग करें res.status(500).send('सर्वर की आंतरिक त्रुटि');});7. eval() और Function() का असुरक्षित उपयोग
eval() और new Function() फ़ंक्शन स्ट्रिंग को कोड के रूप में निष्पादित करते हैं — यह अत्यंत खतरनाक है यदि स्ट्रिंग में उपयोगकर्ता डेटा है।
// खतरनाक! ऐसा कभी न करेंconst userInput = req.body.code;eval(userInput); // हमलावर कोई भी कोड निष्पादित कर सकता हैविकल्प: