Node.js में SQL इंजेक्शन को रोकना


86

क्या Node.js में SQL इंजेक्शन को रोकना संभव है (अधिमानतः एक मॉड्यूल के साथ) जिस तरह से PHP ने तैयार किए गए कथन को उनके खिलाफ संरक्षित किया था।

यदि हां, तो कैसे? यदि नहीं, तो कुछ उदाहरण हैं जो मेरे द्वारा प्रदान किए गए कोड को बायपास कर सकते हैं (नीचे देखें)।


कुछ संदर्भ:

मैं नोड- Mysql मॉड्यूल का उपयोग करके Node.js + MySql से मिलकर बैक-एंड स्टैक के साथ एक वेब एप्लिकेशन बना रहा हूं । प्रयोज्य परिप्रेक्ष्य से, मॉड्यूल बहुत अच्छा है, लेकिन इसने अभी तक PHP के तैयार किए गए विवरणों के बारे में कुछ भी लागू नहीं किया है (हालांकि मुझे पता है कि यह टूडू पर है )।

मेरी समझ से, अन्य बातों के अलावा, तैयार किए गए PHP के कार्यान्वयन ने SQL इंजेक्शन की रोकथाम में बहुत मदद की । मुझे चिंता है, हालाँकि, मेरा नोड.जेएस ऐप समान हमलों के लिए खुला हो सकता है, यहां तक ​​कि डिफ़ॉल्ट रूप से प्रदान किए गए स्ट्रिंग से बचने के साथ (नीचे कोड स्निपेट में)।

नोड- mysql नोड के लिए सबसे लोकप्रिय mysql कनेक्टर प्रतीत होता है। इसलिए, मैं सोच रहा था कि अन्य लोग इस मुद्दे को ध्यान में रखते हुए क्या कर रहे हैं (यदि कुछ भी हो) - या अगर यह नोड के साथ एक मुद्दा है। (यह सुनिश्चित नहीं है कि यह कैसे नहीं होगा, क्योंकि उपयोगकर्ता / क्लाइंट-साइड इनपुट शामिल है)।

क्या मुझे समय - समय पर नोड-मायस्क्-मूल पर स्विच करना चाहिए , क्योंकि यह तैयार किए गए बयान प्रदान करता है? मुझे ऐसा करने में संकोच हो रहा है, क्योंकि यह नोड-मैस्कल जितना सक्रिय नहीं लगता है (हालांकि इसका मतलब यह हो सकता है कि यह पूरा हो गया है)।

यहाँ उपयोगकर्ता पंजीकरण कोड का एक स्निपेट है, जिसमें क्रमशः साइट-स्क्रिप्टिंग और स्क्वायर इंजेक्शन लगाने से रोकने के लिए नोड-माय्सक्कल के तैयार स्टेटमेंट-जैसे सिंटैक्स (जो, जैसा कि मैंने ऊपर बताया है, कैरेक्टर एस्केपिंग है) के साथ सैनिटाइजर मॉड्यूल का उपयोग करता है।

// Prevent xss
var clean_user = sanitizer.sanitize(username);

// assume password is hashed already
var post = {Username: clean_user, Password: hash};

// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
   function(err, results)
   {
       // Can a Sql injection happen here?
   });

जवाबों:


59

node-mysqlपुस्तकालय स्वचालित रूप से बचने के लिए जब इस्तेमाल किया के रूप में आप पहले से ही कर रहे हैं प्रदर्शन करती है। Https://github.com/felixge/node-mysql#es Avoid-query-values देखें


3
जैसा कि मेरे पोस्ट में उल्लेख किया गया है, मुझे पता है कि पुस्तकालय पात्रों से बच जाता है, लेकिन मैं सुरक्षा निहितार्थों के बारे में अधिक चिंतित हूं अगर मैं एक पुस्तकालय में स्विच नहीं करता हूं जिसने तैयार बयानों को लागू किया है, तो क्या कोई SQL इंजेक्शन है जो कि क्या हो सकता है मैं वर्तमान में कर रहा हूँ?
फनसीकी

2
अक्षर बचाना SQL इंजेक्शन को रोकता है। इंजेक्शन तब होते हैं जब पात्र बच नहीं जाते हैं, और दुर्भावनापूर्ण उपयोगकर्ता क्वेरी को बंद करने के लिए इसका उपयोग कर सकते हैं और एक नया कहना शुरू कर सकते हैं, कह सकते हैं, एक तालिका ड्रॉप कर सकते हैं या एक नकली रिकॉर्ड डाल सकते हैं। बच गए पात्रों के साथ, यह संभव नहीं है। विकिपीडिया पर SQL इंजेक्शन के बारे में कुछ अतिरिक्त जानकारी है।
माइकल प्रैट

4
लेकिन क्या यह सभी SQL इंजेक्शन को रोकता है? यह उत्तर बताता है कि (कम से कम PHP + MySQL के लिए) और इसका अर्थ है कि PHP के तैयार किए गए कथन नहीं हैं। फिर, यह PHP के संदर्भ में है।
funseiki

1
आपके लिंक के अनुसार, यह केवल MySQL के आउट-ऑफ-डेट संस्करणों पर काम करता है। मुझे नहीं पता कि यह विशेष हमला नोड पर काम करता है, लेकिन ऐसा लगता है कि यह बहुत विशिष्ट PHP कमजोरियों के साथ करना था, इसलिए मेरी आंत की भावना नहीं है। मैं यह नहीं कह रहा हूं कि नोड-मस्कल में कोई कमजोरियां नहीं हैं, लेकिन इसका उपयोग पहले से ही उत्पादन वातावरण के एक महान सौदे में किया जा रहा है। यदि आप अभी भी SQL इंजेक्शन के बारे में चिंतित हैं, तो मैं सुझाव दूंगा कि बुलेट को काटने और MongoDB जैसी किसी चीज़ की कोशिश करें - यदि आप SQL का उपयोग कर रहे हैं, तो आप SQL इंजेक्शन नहीं कर सकते।
माइकल प्रैट

1
यह उस तरह से देखा गया और MongoDB मार्ग एक अच्छा बिंदु है - हालांकि वर्तमान डिजाइन खुद को एक संबंधपरक स्कीमा के लिए अच्छी तरह से उधार देगा। मैं यह देखने के लिए प्रतीक्षा करूंगा कि क्या किसी और की सुरक्षा भेद्यता पर अंतर्दृष्टि है - अन्यथा, ऐसा लगता है कि आम सहमति सिर्फ नोड-
मायस्कल के

12

भागने के बारे में लाइब्रेरी में रीडमी में एक खंड है। यह जावास्क्रिप्ट-मूल है, इसलिए मैं नोड- mysql- देशी पर स्विच करने का सुझाव नहीं देता । दस्तावेज़ इन दिशानिर्देशों से बचने के लिए कहता है:

संपादित करें: नोड- mysql- देशी भी एक शुद्ध-जावास्क्रिप्ट समाधान है।

  • नंबर अनछुए रह गए हैं
  • बुलियन true/ falseस्ट्रिंग्स में परिवर्तित हो जाते हैं
  • दिनांक ऑब्जेक्ट्स में कनवर्ट किए जाते हैं YYYY-mm-dd HH:ii:ss स्ट्रिंग्स में हैं
  • बफ़र्स को हेक्स स्ट्रिंग्स में परिवर्तित किया जाता है, जैसे X'0fa5'
  • तार सुरक्षित बच गए हैं
  • एरे को सूची में बदल दिया जाता है, उदाहरण के लिए ['a', 'b']बदल जाता है'a', 'b'
  • नेस्टेड सरणियों को समूहबद्ध सूचियों (थोक आवेषण के लिए) [['a', 'b'], ['c', 'd']]में बदल दिया जाता है , उदाहरण के लिए('a', 'b'), ('c', 'd')
  • ऑब्जेक्ट key = 'val'जोड़े में बदल जाते हैं । नेस्टेड वस्तुओं को तार के लिए डाला जाता है।
  • undefined/ nullमें परिवर्तित हो जाते हैंNULL
  • NaN/ के Infinityरूप में छोड़ दिया जाता है। MySQL इनका समर्थन नहीं करता है, और जब तक वे समर्थन को कार्यान्वित नहीं करते हैं, मानों को MySQL त्रुटियों को ट्रिगर करने के लिए उन्हें सम्मिलित करने की कोशिश करेंगे।

यह आपके लिए ऐसा करने की अनुमति देता है:

var userId = 5;
var query = connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
  //query.sql returns SELECT * FROM users WHERE id = '5'
});

साथ में यह भी:

var post  = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
  //query.sql returns INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'
});

उन कार्यों के अलावा, आप बच के कार्यों का उपयोग भी कर सकते हैं:

connection.escape(query);
mysql.escape(query);

क्वेरी पहचानकर्ताओं से बचने के लिए:

mysql.escapeId(identifier);

और तैयार बयानों पर आपकी टिप्पणी की प्रतिक्रिया के रूप में:

प्रयोज्य परिप्रेक्ष्य से, मॉड्यूल बहुत अच्छा है, लेकिन इसने अभी तक PHP के तैयार किए गए विवरणों के लिए कुछ भी लागू नहीं किया है।

इस कनेक्टर के लिए तैयार किए गए बयान टूडू सूची में हैं, लेकिन यह मॉड्यूल आपको कम से कम कस्टम प्रारूपों को निर्दिष्ट करने की अनुमति देता है जो तैयार किए गए बयानों के समान हो सकते हैं। यहाँ से एक उदाहरण है readme:

connection.config.queryFormat = function (query, values) {
  if (!values) return query;
  return query.replace(/\:(\w+)/g, function (txt, key) {
    if (values.hasOwnProperty(key)) {
      return this.escape(values[key]);
    }
    return txt;
  }.bind(this));
};

यह कनेक्शन के क्वेरी प्रारूप को बदल देता है ताकि आप इस तरह से प्रश्नों का उपयोग कर सकें:

connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });
//equivalent to
connection.query("UPDATE posts SET title = " + mysql.escape("Hello MySQL");

प्रतिक्रिया के लिए धन्यवाद - मुझे तैयार शैली की जानकारी है। हालांकि, इसके बावजूद, पात्र बच गए हैं। देखें: "हालांकि, यह वास्तव में केवल एक ही कनेक्शन का उपयोग करता है ।स्केप ()" । जहाँ तक नोड- mysql-native का उपयोग नहीं करना है: यह वही है जिसके साथ मैं संघर्ष कर रहा हूँ। यदि नोड- mysql- देशी इम्प्लीमेंट ने स्टेटमेंट तैयार किया है और इसके कार्यान्वयन एसक्यूएल इंजेक्शन को रोकता है, तो क्या मुझे तब तक स्विच नहीं करना चाहिए जब तक कि नोड- mysql उनके पास न हो?
फनसीकी

यह मुर्गी और अंडे के सवाल की तरह है। मैं अपने ड्राइवर को सक्रिय रूप से विकसित नहीं कर रहा हूं, क्योंकि ज्यादातर लोग @ felixge का उपयोग करते हैं, मैं नोड-मायस्कल को तैयार किए गए बयानों को पोर्ट करने के लिए कुछ समय खोजने की कोशिश करूंगा क्योंकि यह वास्तव में कुछ प्रदर्शन लाभ देता है (और संभवतः एसक्यूएल इंजेक्शन को कठिन बना देता है)। बेझिझक टिप्पणी / मुद्दों को पोस्ट करें अगर आप इसे देने का फैसला करते हैं
एंड्री सिदोरोव

1
@funseiki मुझे यकीन है कि तैयार किए गए बयान सबसे अच्छा समाधान होंगे, लेकिन मुझे पूरा यकीन है कि भागने से SQL इंजेक्शन को रोका जा सकेगा। चूंकि मॉड्यूल खुद जॉयंट द्वारा समर्थित है, इसलिए मॉड्यूल सक्रिय है और स्पष्ट रूप से पूरी तरह से जाँच की गई है। यदि यह मॉड्यूल उत्पादन के लिए तैयार नहीं था, तो मुझे नहीं लगता कि पिछले महीने मॉड्यूल में औसतन 1000 डाउनलोड / दिन होंगे। ध्यान दें कि नोड- mysql- मूल 6 महीने का है क्योंकि इसे अंतिम रूप से विकसित किया गया था, और नोड- mysql बहुत सक्रिय है, जिस पर कई लोग काम कर रहे हैं।
हेक्सासैनाइड

@AndreySidorov टिप्पणी के लिए धन्यवाद - अगर मैं इससे निपटने का प्रयास करता हूं, तो मैं एक अपडेट पोस्ट करूंगा। मुझे नहीं लगता कि यह कभी भी जल्द ही होगा, हालांकि, ऐसा नहीं लगता है क्योंकि यह संभाल करने के लिए एक आसान जानवर होगा (मुझे वर्तमान में समय की तुलना में अधिक शोध की आवश्यकता होगी)। उस ड्राइवर को बनाने के लिए भी धन्यवाद - आप लोग इसका कारण हैं Node.js एप्स को जल्दी से चलाना आसान बनाता है
funseiki

@hexacyanide क्योंकि नोड- mysql इतना लोकप्रिय है, मैं उम्मीद कर रहा था कि मैं समुदाय के सदस्यों से उन सुरक्षा मुद्दों के बारे में प्रतिक्रिया प्राप्त कर सकता हूं जो उन्होंने सामना किया है (या रोका गया) और साथ ही साथ एक ठोस तर्क के साथ कि वर्तमान चरित्र पलायन दृष्टिकोण सुरक्षित क्यों है उनके कोड के लिए पर्याप्त है।
फनीस्की

12

मुझे लगता है कि यह एक पुरानी पोस्ट है, लेकिन ऐसा लगता है कि एक उत्तर को कभी चिह्नित नहीं किया गया था इसलिए मैं इसे वहां फेंक दूंगा।

परीक्षण के संबंध में यदि आप जिस मॉड्यूल का उपयोग कर रहे हैं वह सुरक्षित है या नहीं तो कई मार्ग हैं जिन्हें आप ले जा सकते हैं। मैं प्रत्येक के पेशेवरों / विपक्षों को छूऊंगा ताकि आप अधिक सूचित निर्णय ले सकें।

वर्तमान में आपके द्वारा उपयोग किए जा रहे मॉड्यूल के लिए कोई भेद्यता नहीं हैं, हालांकि, इससे अक्सर सुरक्षा की झूठी भावना पैदा हो सकती है क्योंकि वर्तमान में आपके द्वारा उपयोग किए जा रहे मॉड्यूल / सॉफ़्टवेयर पैकेज का शोषण करने वाली एक भेद्यता हो सकती है और आप सतर्क नहीं होंगे एक समस्या जब तक कि विक्रेता एक फिक्स / पैच लागू नहीं करता है।

  1. कमजोरियों को कम करने के लिए आपको मेलिंग सूचियों, मंचों, आईआरसी और हैकिंग से संबंधित चर्चाओं का पालन करना होगा। प्रो: आप अक्सर ऐसा कर सकते हैं कि किसी लाइब्रेरी के भीतर संभावित समस्याओं के बारे में आपको पता चल जाए, इससे पहले कि किसी वेंडर को अलर्ट किया जाए या उनके सॉफ्टवेयर पर हमले के संभावित एवेन्यू को मापने के लिए एक फिक्स / पैच जारी किया जाए। कांग्रेस: ​​यह बहुत समय लेने वाला और संसाधन गहन हो सकता है। यदि आप RSS फ़ीड्स, लॉग पार्सिंग (IRC चैट लॉग्स) और या मुख्य वाक्यांशों का उपयोग करके वेब स्क्रैपर (इस मामले में नोड- mysql- मूल) का उपयोग करके इस मार्ग पर जाते हैं और सूचनाएं इन संसाधनों को ट्रोल करने में लगने वाले समय को कम करने में मदद कर सकती हैं।

  2. एक fuzzer बनाएं, जिसका उपयोग करने fuzzer या अन्य भेद्यता ढांचा जैसे Metasploit , sqlmap आदि मदद परीक्षण करने के लिए समस्याओं कि विक्रेता के लिए ध्यान दिया है नहीं हो सकता है के लिए। प्रो: यह स्वीकार्य स्तर पर सुनिश्चित करने के लिए अग्नि विधि साबित हो सकता है कि आप जिस मॉड्यूल / सॉफ्टवेयर को लागू कर रहे हैं वह सार्वजनिक पहुंच के लिए सुरक्षित है या नहीं। कांग्रेस: ​​यह भी समय लेने वाली और महंगी हो जाती है। दूसरी समस्या झूठी सकारात्मकता के साथ-साथ उन परिणामों की अशिक्षित समीक्षा से उपजी होगी जहां एक समस्या रहती है लेकिन ध्यान नहीं दिया जाता है।

वास्तव में सुरक्षा, और सामान्य रूप से आवेदन सुरक्षा बहुत समय लेने वाली और संसाधन गहन हो सकती है। उपरोक्त दो विकल्पों को निष्पादित करने के लिए लागत प्रभावशीलता (जनशक्ति, संसाधन, समय, वेतन आदि) निर्धारित करने के लिए एक बात हमेशा प्रबंधकों का उपयोग एक सूत्र होगा।

वैसे भी, मुझे लगता है कि यह एक 'हाँ' या 'नहीं' का जवाब है जो उम्मीद कर रहा है, लेकिन मुझे नहीं लगता कि कोई भी आपको यह दे सकता है जब तक कि वे प्रश्न में सॉफ़्टवेयर का विश्लेषण नहीं करते हैं।


3

मुझे पता है कि यह सवाल पुराना है, लेकिन दिलचस्पी रखने वाले किसी के लिए, मैसकल -मूल पुराना हो चुका है इसलिए यह MySQL2 बन गया है जो मूल MySQL मॉड्यूल की टीम की मदद से बनाया गया एक नया मॉड्यूल है। इस मॉड्यूल में और अधिक विशेषताएं हैं और मुझे लगता है कि इसमें वही है जो आप चाहते हैं कि यह अधिक सुरक्षा के लिए PHP में स्टेटमेंट (.ececute () का उपयोग करके) तैयार किया है।

यह बहुत सक्रिय है (अंतिम परिवर्तन 2-1 दिनों से था) मैंने इसे पहले कोशिश नहीं की थी, लेकिन मुझे लगता है कि यह वही है जो आप चाहते हैं और अधिक।


-1

सबसे आसान तरीका है कि आप अपने डेटाबेस के सभी इंटरैक्शन को अपने स्वयं के मॉड्यूल में संभाल लें जो आप अपने मार्गों में निर्यात करते हैं। यदि आपके मार्ग में डेटाबेस का कोई संदर्भ नहीं है, तो SQL इसे वैसे भी नहीं छू सकता है।


यह वास्तव में ओपी के सवाल का जवाब नहीं देता है कि स्वच्छता कैसे करें।
क्रिस्टोफर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.