TypeScript अनुप्रयोगों की सुरक्षा: व्यवहार में शीर्ष 10 कमजोरियाँ
\n\nTypeScript, JavaScript के ऊपर एक परत है जो स्थैतिक टाइपिंग जोड़ता है। कई डेवलपर्स गलती से मानते हैं कि सख्त टाइपिंग स्वचालित रूप से एप्लिकेशन को सुरक्षित बना देती है। ऐसा नहीं है। TypeScript कंपाइलर प्रकारों की जाँच करता है, लेकिन तार्किक त्रुटियों, इंजेक्शन या प्रमाणीकरण समस्याओं से रक्षा नहीं करता है। इस लेख में, हम TypeScript अनुप्रयोगों में 10 सबसे सामान्य कमजोरियों का विश्लेषण करेंगे, कोड उदाहरण दिखाएंगे और सुरक्षा के लिए विशिष्ट सिफारिशें देंगे। यह लेख शुरुआती और अनुभवी डेवलपर्स दोनों के लिए उपयोगी होगा।
\n\n1. गलत इनपुट प्रोसेसिंग के माध्यम से क्रॉस-साइट स्क्रिप्टिंग (XSS)
\n\nXSS अभी भी सबसे खतरनाक कमजोरियों में से एक है। TypeScript स्वचालित रूप से आउटपुट को एस्केप नहीं करता है। यदि आप सैनिटाइज़ेशन के बिना HTML टेम्पलेट में उपयोगकर्ता डेटा डालते हैं, तो आप हमलों के लिए दरवाजा खोल देते हैं।
\n\nअसुरक्षित कोड
\nfunction renderComment(comment: string): string {\n return `<div>${comment}</div>`;\n}\n\n// हमलावर प्रेषित करता है: <script>alert('XSS')</script>\n\n\nसही किया गया कोड
\nimport { escape } from 'lodash';\n\nfunction renderComment(comment: string): string {\n const safeComment = escape(comment);\n return `<div>${safeComment}</div>`;\n}\n\n\nसिफारिश: एस्केपिंग के लिए हमेशा लाइब्रेरी (DOMPurify, lodash.escape) या ऑटो-एस्केपिंग वाले टेम्पलेट इंजन (React JSX, Handlebars) का उपयोग करें।
\n\n2. स्ट्रिंग टेम्पलेट्स के माध्यम से SQL-इंजेक्शन
\n\nTypeScript SQL क्वेरी बनाने के लिए टेम्पलेट स्ट्रिंग्स का उपयोग करने की अनुमति देता है। यदि आप उपयोगकर्ता डेटा डालते हैं तो यह SQL-इंजेक्शन का सीधा रास्ता है।
\n\nअसुरक्षित कोड
\nasync function getUser(id: string): Promise<User | null> {\n const query = `SELECT * FROM users WHERE id = '${id}'`;\n const result = await db.query(query);\n return result.rows[0];\n}\n\n\nसही किया गया कोड
\nasync function getUser(id: string): Promise<User | null> {\n const query = 'SELECT * FROM users WHERE id = $1';\n const result = await db.query(query, [id]);\n return result.rows[0];\n}\n\n\nसिफारिश: पैरामीटराइज़्ड क्वेरी या ORM (TypeORM, Prisma, Sequelize) का उपयोग करें। SQL के लिए कभी भी स्ट्रिंग्स को कॉन्केटनेट न करें।
\n\n3. असुरक्षित पासवर्ड तुलना
\n\nपासवर्ड तुलना के कार्यान्वयन में त्रुटि टाइमिंग हमलों का कारण बन सकती है। TypeScript डेवलपर्स अक्सर हैश की तुलना करने के लिए === ऑपरेटर का उपयोग करते हैं, जो असुरक्षित है।
असुरक्षित कोड
\nasync function verifyPassword(\n inputPassword: string, \n storedHash: string\n): Promise<boolean> {\n const inputHash = await bcrypt.hash(inputPassword, 10);\n return inputHash === storedHash; // कमजोरी: timing attack\n}\n\n\nसही किया गया कोड
\nimport bcrypt from 'bcrypt';\n\nasync function verifyPassword(\n inputPassword: string, \n storedHash: string\n): Promise<boolean> {\n return bcrypt.compare(inputPassword, storedHash);\n}\n\n\nसिफारिश: हैशिंग लाइब्रेरी (bcrypt.compare, argon2.verify) से अंतर्निहित तुलना फ़ंक्शन का उपयोग करें। वे टाइमिंग हमलों से सुरक्षित हैं।
\n\n4. रिकर्सिव ऑब्जेक्ट मर्जिंग के माध्यम से प्रोटोटाइप प्रदूषण
\n\nTypeScript अनुप्रयोग अक्सर डीप कॉपी या ऑब्जेक्ट मर्जिंग फ़ंक्शन का उपयोग करते हैं। यदि कुंजियों को नियंत्रित नहीं किया जाता है, तो हमलावर Object.prototype को दूषित कर सकता है।
असुरक्षित कोड
\nfunction merge(target: Record<string, any>, source: Record<string, any>) {\n for (const key in source) {\n if (typeof source[key] === 'object') {\n target[key] = merge(target[key] || {}, source[key]);\n } else {\n target[key] = source[key];\n }\n }\n return target;\n}\n\n// हमलावर प्रेषित करता है