flawopen.com/SQL इंजेक्शन/Javascript
सोचिए एक टिकट काउंटर जहां केवल टिकट नंबर दर्ज करना है। यदि कोई चालाक कोड टाइप करके सिस्टम से सभी टिकट दिखाने को कह दे, तो यह SQL इंजेक्शन है।
उपयोगकर्ता इनपुट को सीधे SQL टेक्स्ट में जोड़ने से यह भेद्यता उत्पन्न होती है।
2015 में टॉकटॉक कंपनी के 150,000 ग्राहकों का डेटा लीक हुआ और 400,000 पाउंड का जुर्माना लगाया गया।
स्रोत: यूके सूचना आयुक्त कार्यालय (ICO), 2016।// userId comes straight from request query
async function getUser(pool, userId) {
const query = `SELECT * FROM users
WHERE id = ${userId}`;
const [rows] = await pool.query(query);
return rows[0];
}
// value is passed separately, never inlined
async function getUser(pool, userId) {
const [rows] = await pool.query(
'SELECT * FROM users WHERE id = ?',
[userId]
);
return rows[0];
}
पैरामीटरयुक्त क्वेरी स्ट्रक्चर और डेटा को अलग-अलग भेजती है जिससे इनपुट कोड के रूप में निष्पादित नहीं होता।
mysql2 में ? का उपयोग होता है जबकि pg में $1, $2 का।
मैनुअल एस्केपिंग विफल हो सकती है, पैरामीटर बाइंडिंग ही एकमात्र सुरक्षित तरीका है।
grep -rn "query(\`.*\${" --include="*.js" --include="*.ts" .
npx eslint --rule 'no-template-curly-in-string: error' .
p/javascript ruleset in CI to catch unparameterized database queries automatically.सामान्य API सुरक्षित है, लेकिन raw query में पैरामीटर पास करना आवश्यक है।