आपका कोड निशाने पर: क्यों TypeScript सुरक्षा एक विकल्प नहीं, बल्कि एक आवश्यकता है
\n\nक्या आपने कभी सोचा है कि जब कोई उपयोगकर्ता आपकी साइट के सर्च बॉक्स में सिर्फ "Python पर किताबें" नहीं, बल्कि कुछ इस तरह '; DROP TABLE users; -- टाइप करता है तो क्या होता है? यदि आपका TypeScript पर बैकएंड इस तरह के मोड़ के लिए तैयार नहीं है, तो आप सिर्फ एक त्रुटि प्राप्त करने का जोखिम नहीं उठा रहे हैं, बल्कि अपना पूरा डेटाबेस खो सकते हैं। क्या यह किसी हॉरर फिल्म की स्क्रिप्ट जैसा लगता है? वेब डेवलपमेंट की वास्तविक दुनिया में आपका स्वागत है, जहां TypeScript सुरक्षा कोई फैशनेबल विशेषता नहीं, बल्कि कोड की बुनियादी स्वच्छता है।
इस लेख में हम उबाऊ व्याख्यान नहीं देंगे। हम किसी भी वेब एप्लिकेशन के दो मुख्य दुश्मनों को समझेंगे: SQL इंजेक्शन और XSS (क्रॉस-साइट स्क्रिप्टिंग)। आप जानेंगे कि हैकर्स आपके प्रोजेक्ट पर कैसे हमला करते हैं, और सबसे महत्वपूर्ण बात, वास्तविक उदाहरणों और सर्वोत्तम प्रथाओं के साथ अपने TypeScript कोड को एक अभेद्य किले में कैसे बदलें।
\n\nSQL इंजेक्शन: कैसे हमलावर आपके डेटाबेस से "बात" करते हैं
\n\nकल्पना करें कि आपका एप्लिकेशन एक विनम्र कॉन्सियर्ज है जो मेहमान के हर अनुरोध को पूरा करता है। यदि मेहमान कहता है: "कमरा नंबर 5 दिखाएं", तो कॉन्सियर्ज दिखाता है। लेकिन क्या होगा यदि मेहमान कहता है: "सभी कमरे दिखाएं और मुझे तिजोरी की चाबी दें"? बिना जांच के, कॉन्सियर्ज यह भी कर देगा। SQL इंजेक्शन ठीक इसी तरह काम करता है: हमलावर सामान्य उपयोगकर्ता इनपुट में अपने कमांड "एम्बेड" करता है।
\n\nमान लीजिए, आपके पास नाम से उपयोगकर्ता खोजने के लिए एक सरल क्वेरी है:
\n\n// ❌ खतरनाक: असुरक्षित कोड\nconst userName = req.body.username; // उपयोगकर्ता ने "admin" दर्ज किया\nconst query = `SELECT * FROM users WHERE name = '${userName}'`;\ndb.execute(query);\n\nयह हानिरहित लगता है? अब कल्पना करें कि उपयोगकर्ता दर्ज करता है: admin' OR '1'='1। क्वेरी बन जाती है:
SELECT * FROM users WHERE name = 'admin' OR '1'='1'\n\nबधाई हो! आपने अभी-अभी हमलावर को सिस्टम के सभी उपयोगकर्ताओं की सूची दे दी है। और अगर वह कुछ हटाना चाहता है? आसान: admin'; DROP TABLE users; -- — और आपका डेटाबेस खत्म।
कैसे बचाव करें: पैरामीटराइज्ड क्वेरी — आपकी ढाल
\n\nTypeScript में SQL इंजेक्शन से सुरक्षा का मुख्य नियम: उपयोगकर्ता डेटा को कभी भी सीधे क्वेरी स्ट्रिंग में न डालें। पैरामीटराइज्ड क्वेरी (prepared statements) का उपयोग करें। वे SQL कोड और डेटा को अलग करते हैं, और डेटाबेस उपयोगकर्ता इनपुट को केवल डेटा के रूप में मानता है, कमांड के रूप में नहीं।
\n\npg लाइब्रेरी (PostgreSQL के लिए) के साथ उदाहरण:
// ✅ सुरक्षित: पैरामीटराइज्ड क्वेरी\nimport { Pool } from 'pg';\n\nconst pool = new Pool({\n connectionString: process.env.DATABASE_URL\n});\n\nasync function getUserByName(userName: string): Promise<any> {\n const query = 'SELECT * FROM users WHERE name = $1';\n const result = await pool.query(query, [userName]);\n return result.rows;\n}\n\n// उपयोग\nconst userInput = req.body.username; // भले ही यह "admin' OR '1'='1" हो\nconst user = await getUserByName(userInput);\n// डेटाबेस इसे ऐसे अजीब नाम वाले उपयोगकर्ता की खोज के रूप में मानेगा\nconsole.log(user); // [] — कुछ नहीं मिला\n\nयही सिद्धांत अन्य ORM जैसे Prisma या TypeORM के साथ भी काम करता है। वे डिफ़ॉल्ट रूप से पैरामीटराइज्ड क्वेरी का उपयोग करते हैं, जो TypeScript सुरक्षा को एक अंतर्निहित सुविधा बनाता है।
\n\n// ✅ सुरक्षित: Prisma का उपयोग\nimport { PrismaClient } from '@prisma/client';\n\nconst prisma = new PrismaClient();\n\nasync function findUser(name: string) {\n return prisma.user.findUnique({\n where: { name: name } // Prisma स्वयं इनपुट डेटा को एस्केप करता है\n });\n}\n\nXSS हमले: जब आपकी साइट किसी और का कोड प्रसारित करने लगे
\n\nयदि SQL इंजेक्शन डेटाबेस पर हमला करते हैं, तो XSS (क्रॉस-साइट स्क्रिप्टिंग) आपके उपयोगकर्ताओं पर हमला करता है। कल्पना करें कि कोई दुर्भावनापूर्ण