knex दस्तावेज़ों को ध्यान से पढ़ें कि कैसे knex रॉ में मान पास करें (http://knexjs.org/#Raw )।
यदि आप कच्चे के लिए बाध्यकारी पैरामीटर के रूप में मान पास कर रहे हैं जैसे:
knex.raw('select * from foo where id = ?', [1])
उस स्थिति में पैरामीटर और क्वेरी स्ट्रिंग को SQL इंजेक्शन से क्वेरी की सुरक्षा करने वाले डेटाबेस ड्राइवर को अलग से पास किया जाता है।
अन्य क्वेरी निर्माता विधियां हमेशा आंतरिक रूप से बाध्यकारी प्रारूप का उपयोग करती हैं ताकि वे भी सुरक्षित हों।
यह देखने के लिए कि डेटाबेस ड्राइवर को कुछ क्वेरी कैसे पास की जाती है:
knex('foo').where('id', 1).toSQL().toNative()
जो क्वेरी चलाने के लिए ड्राइवर को दिए गए SQL स्ट्रिंग और बाइंडिंग को आउटपुट करेगा (https://runkit.com/ एम्बेड/2yhqebv6pte6 )।
सबसे बड़ी गलती जो कोई knex कच्चे प्रश्नों के साथ कर सकता है, वह है जावास्क्रिप्ट टेम्प्लेट स्ट्रिंग का उपयोग करना और वैरिएबल को सीधे SQL स्ट्रिंग प्रारूप में इंटरपोलेट करना जैसे:
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS
ध्यान देने वाली एक बात यह है कि नक्स टेबल/पहचानकर्ता नाम ड्राइवर के लिए बाइंडिंग के रूप में पारित नहीं किए जा सकते हैं, इसलिए उन लोगों के साथ उपयोगकर्ता से टेबल/कॉलम नामों को न पढ़ने के लिए अतिरिक्त सावधानी बरतनी चाहिए और पहले उन्हें ठीक से सत्यापित किए बिना उनका उपयोग करना चाहिए।
संपादित करें:
यह कहकर कि पहचानकर्ता नामों को बाइंडिंग के रूप में पारित नहीं किया जा सकता है, मेरा मतलब है कि जब कोई ??
. का उपयोग कर रहा हो पहचानकर्ता नाम के लिए knex -बाइंडिंग, जिसे डेटाबेस ड्राइवर को पास करने पर SQL स्ट्रिंग के हिस्से के रूप में प्रस्तुत किया जाएगा।