TypeScript अनुप्रयोगों की सुरक्षा: शीर्ष 10 कमजोरियाँ
TypeScript, JavaScript के ऊपर एक अतिरिक्त परत के रूप में, इसकी कई कमजोरियों को विरासत में लेता है, साथ ही टाइप सिस्टम और कंपाइलेशन से संबंधित विशिष्ट जोखिम भी जोड़ता है। यहां तक कि सख्त टाइपिंग भी सुरक्षा की गारंटी नहीं देती है — तर्क में त्रुटियां और असुरक्षित प्रथाएं गंभीर परिणाम दे सकती हैं। इस लेख में, हम TypeScript अनुप्रयोगों की शीर्ष 10 कमजोरियों का विश्लेषण करेंगे, कोड उदाहरण प्रदान करेंगे और सुरक्षा के लिए सिफारिशें देंगे।
1. Cross-Site Scripting (XSS) dangerouslySetInnerHTML के माध्यम से
React/TypeScript अनुप्रयोगों में सबसे आम कमजोरियों में से एक dangerouslySetInnerHTML के माध्यम से अनएस्केप्ड HTML डालना है।
// ❌ कमजोर कोडfunction UserComment({ comment }: { comment: string }) { return <div dangerouslySetInnerHTML={{ __html: comment }} />;}
// ✅ सुरक्षित विकल्पimport DOMPurify from 'dompurify';
function SafeComment({ comment }: { comment: string }) { const sanitized = DOMPurify.sanitize(comment); return <div dangerouslySetInnerHTML={{ __html: sanitized }} />;}2. SQL-इंजेक्शन अनएस्केप्ड क्वेरी के माध्यम से
उपयोगकर्ता इनपुट के साथ SQL क्वेरी में टेम्पलेट स्ट्रिंग का उपयोग करना इंजेक्शन का सीधा रास्ता है।
// ❌ कमजोर कोडasync function getUser(id: string) { const query = `SELECT * FROM users WHERE id = '${id}'`; return db.execute(query);}
// ✅ सुरक्षित विकल्प (पैरामीटराइज्ड क्वेरी का उपयोग)async function safeGetUser(id: string) { const query = 'SELECT * FROM users WHERE id = $1'; return db.execute(query, [id]);}3. Prototype Pollution गहरे ऑब्जेक्ट मर्ज के माध्यम से
TypeScript ऑब्जेक्ट को आसानी से कॉपी करने की अनुमति देता है, लेकिन प्रोटोटाइप चेन की जांच नहीं करता है।
// ❌ कमजोर कोडfunction merge(target: any, source: any) { for (const key in source) { if (typeof source[key] === 'object') { target[key] = merge(target[key] || {}, source[key]); } else { target[key] = source[key]; } } return target;}
// ✅ सुरक्षित विकल्पfunction safeMerge(target: Record<string, any>, source: Record<string, any>) { const result = { ...target }; for (const key of Object.keys(source)) { if (key === '__proto__' || key === 'constructor') continue; if (typeof source[key] === 'object' && !Array.isArray(source[key])) { result[key] = safeMerge(result[key] || {}, source[key]); } else { result[key] = source[key]; } } return result;}4. NoSQL-इंजेक्शन (MongoDB)
MongoDB के साथ काम करते समय, अनुरोध से सीधे ऑब्जेक्ट पास करने से $where या $regex ऑपरेटरों का इंजेक्शन हो सकता है।
// ❌ कमजोर कोडapp.post('/login', async (req, res) => { const { username, password } = req.body; const user = await User.findOne({ username, password }); // यदि { "$gt": "" } पास किया जाए, तो जांच को बायपास किया जा सकता है});
// ✅ सुरक्षित विकल्पimport { sanitize } from 'mongo-sanitize';
app.post('/login', async (req, res) => { const cleanBody = sanitize(req.body); const user = await User.findOne({ username: cleanBody.username, password: cleanBody.password });});5. child_process के माध्यम से OS कमांड
बिना एस्केपिंग के exec के माध्यम से उपयोगकर्ता इनपुट का निष्पादन एक गंभीर कमजोरी है।
// ❌ कमजोर कोडimport { exec } from 'child_process';
function runCommand(input: string) { exec(`echo ${input}`, (err, stdout) => { console.log(stdout); });}
// ✅ सुरक्षित विकल्पimport { execFile } from 'child_process';
function safeCommand(input: string) { // execFile का उपयोग आर्गुमेंट्स की सूची के साथ करें execFile('echo', [input], (err, stdout) => { console.log(stdout); });}