FlawOpen

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 बनाना
// इनपुट 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' .

अक्सर पूछे जाने वाले प्रश्न

क्या knex.raw() अपने आप SQL Injection रोकता है?

नहीं। अविश्वसनीय मानों के लिए bindings दें, जैसे knex.raw("... = ?", [value])। मान को SQL string में जोड़ने से वह SQL source बन जाता है। हर raw कॉल और इनपुट जाँचें।

क्या ?? के साथ उपयोगकर्ता का चुना कोई भी column ले सकता हूँ?

?? Knex का raw identifier placeholder है; यह identifier quote करता है, अनुमति नहीं देता। विकल्पों को allowlist तक सीमित रखें।

संदर्भ

यह भी देखें SQL इंजेक्शन (CWE-89): यह कैसे काम करता है और हर भाषा में इसे कैसे रोकें — flawopen.com MyBatis ${} बनाम #{}: SQL Injection से बचाव MySQLi बनाम PDO: सुरक्षित Prepared Statements क्या NHibernate SQL Injection से बचाता है? MongoDB NoSQL Injection: सुरक्षित query filters Numeric ID में SQL Injection का जोखिम पैरामीटराइज़्ड क्वेरी क्या है?