flawopen.com/JavaScript में SQL Injection/Knex.js
क्या Knex.js SQL Injection से सुरक्षित है?
SQL को छपे फ़ॉर्म की तरह समझें: binding इनपुट को value वाले खाने में रखता है; string interpolation उसे निर्देशों में जोड़ देता है। Knex query builder और knex.raw(sql, bindings) मानों को अलग रखते हैं, लेकिन table और column नाम SQL संरचना हैं; इन्हें विश्वसनीय allowlist से चुनें।
?? Knex का raw identifier placeholder है; यह identifier quote करता है, अनुमति नहीं देता। विकल्पों को allowlist तक सीमित रखें।सुरक्षित — bindings और allowlist
const query = knex.raw(
`SELECT * FROM users WHERE id = ${userId}`
);
// इनपुट SQL source में जोड़ा जाता है। const allowedSortColumns = new Set(["created_at", "name"]); const rows = await knex("users") .where("id", userId) .orderBy( allowedSortColumns.has(requestedSort) ? requestedSort : "created_at", requestedDirection === "asc" ? "asc" : "desc" ); // मान को SQL syntax से अलग रखें। knex.raw("SELECT * FROM users WHERE id = ?", [userId]);
Knex bindings मानों की रक्षा कैसे करते हैं
.where(), .insert() और .select() जैसे तरीके मानों को बने SQL से अलग रखते हैं। raw में मान bindings के रूप में दें: knex.raw("... = ?", [value])। ? मान और ?? identifier दर्शाता है। इनपुट को SQL template में interpolate न करें।
डायनेमिक identifiers के लिए allowlist चाहिए
binding उपयोगकर्ता-चुने column, table, sort, operator या SQL अंश को अनुमति नहीं देता। ?? identifier quote करता है, पर चयन की अनुमति तय नहीं करता। .orderBy() से पहले विकल्प को तय allowlist में map करें; SQL keywords और operators कोड में स्थिर रखें।
raw queries की जाँच कैसे करें
हर knex.raw() खोजें और SQL string तथा bindings साथ में जाँचें। data values bindings से और dynamic identifiers छोटी allowlist से आने चाहिए। raw query अपने आप कमजोर नहीं होती; सुरक्षा SQL और इनपुट बनाने के तरीके पर निर्भर है।
rg -n 'knex\.raw\(' -g '*.js' -g '*.ts' -g '*.mjs' -g '*.cjs' .अक्सर पूछे जाने वाले प्रश्न
नहीं। अविश्वसनीय मानों के लिए bindings दें, जैसे knex.raw("... = ?", [value])। मान को SQL string में जोड़ने से वह SQL source बन जाता है। हर raw कॉल और इनपुट जाँचें।
?? Knex का raw identifier placeholder है; यह identifier quote करता है, अनुमति नहीं देता। विकल्पों को allowlist तक सीमित रखें।
संदर्भ
- Knex.js दस्तावेज़ — Raw और bindings
- Knex.js दस्तावेज़ — Query builder
- flawopen.com — JavaScript में SQL Injection