2012-11-18 7 views
9
में

मैं कैसे MongoDB में जावास्क्रिप्ट NoSQL इंजेक्शन रोका जा सकता है?जावास्क्रिप्ट NoSQL इंजेक्शन रोकथाम MongoDB

मैं एक नोड.जेएस एप्लिकेशन पर काम कर रहा हूं और मैं req.body पास कर रहा हूं, जो कि एक जेसन ऑब्जेक्ट है, जो मोंगोस मॉडल के सेव फ़ंक्शन में है। मैंने सोचा कि दृश्यों के पीछे सुरक्षाएं थीं, लेकिन ऐसा नहीं लगता है।

+3

जब तक आप 'JSON.parse' ('eval' के विपरीत) का उपयोग कर JSON को पार्स कर रहे हैं, और आप डेटा को मान्य कर रहे हैं, तो आपको ठीक होना चाहिए। JSON स्वाभाविक रूप से खतरनाक नहीं है :) – Ryan

+2

चीजों को अपने डेटाबेस में प्रवेश करने से रोकें, अपने डेटाबेस में चीजों को कोड के रूप में चलाने से रोकें। – Incognito

+0

तो मैं अपनी पोस्ट ऑब्जेक्ट को कैसे पार्स करूं? – daniel

उत्तर

3

नोट मेरा उत्तर अब प्रासंगिक नहीं हो सकता है। कृपया अन्य उत्तरों का संदर्भ लें।

-

एक ग्राहक के रूप में कार्यक्रम MongoDB में एक प्रश्न असेंबल, यह एक BSON वस्तु, न कोई स्ट्रिंग बनाता है। इस प्रकार पारंपरिक एसक्यूएल इंजेक्शन हमले एक समस्या नहीं हैं।

जानकारी के लिए documentation

अद्यतन

eval जो मनमाने ढंग से जे एस निष्पादित कर सकते हैं की तरह अभिव्यक्ति से बचें का पालन करें। यदि आप उपयोगकर्ता से इनपुट ले रहे हैं और eval चल रहे इनपुट की सफाई किए बिना अभिव्यक्तियों को चला रहे हैं तो आप स्क्रू कर सकते हैं। जैसा कि JoBu1324 द्वारा इंगित किया गया है, where, mapReduce और group जैसे संचालन सीधे जेएस अभिव्यक्ति निष्पादित करने की अनुमति देता है।

+3

मैं एक "हालांकि, जावास्क्रिप्ट इंजेक्शन से सावधान रहना चाहता हूं!" जवाब के लिए। Http://media.blackhat.com/bh-us-11/Sullivan/BH_US_11_Sullivan_Server_Side_WP.pdf पढ़ें। – borisdiakur

+1

[docs] (http://docs.mongodb.org/manual/faq/developers/#how-does-mongodb-address-sql-or-query-injection) में node.js टैग और जावास्क्रिप्ट उपखंड को ध्यान में रखते हुए, क्या यह जवाब गलत है? मैं अभी इस सवाल का जवाब खुद खोज रहा हूं। – JoBu1324

+0

@ JoBu1324 मैंने जवाब अपडेट किया है। उत्तर में सुधार के लिए धन्यवाद :) –

7

हालांकि पोस्ट अप्रचलित है, मैं जवाब दे रहा हूँ।

मुझे तीन तरीकों से पता है।

पहले: एक बहुउद्देशीय content-filter नहीं है। फ़िल्टरिंग करके मोंगो डीबी इंजेक्शन संरक्षण भी प्रदान करता है।

दूसरा:mongo-sanitize, हेल्पर क्वेरी चयनकर्ता इंजेक्शन के खिलाफ MongoDB प्रश्नों को साफ़ करने में।

तीसरा: मैं over here इस समाधान जो MongoDB के लिए भी लागू किया जा सकता देखा था। इसे लागू करना वाकई आसान है। जावास्क्रिप्ट के अंतर्निहित escape() फ़ंक्शन का उपयोग करें।

escape() स्ट्रिंग को ascii कोड में परिवर्तित करता है। $ne को %24ne में परिवर्तित किया गया है।

var privateKey = escape(req.params.privateKey); 

App.findOne({ key: privateKey }, function (err, app) { 
    //do something here 
} 
12

Sushant के जवाब सही नहीं है। आप को मोंगोडीबी में नोएसक्यूएल इंजेक्शन के बारे में जागरूक होने के लिए की आवश्यकता है।

उदाहरण (here से लिया)

User.findOne({ 
    "name" : req.params.name, 
    "password" : req.params.password 
}, callback); 

तो req.params.password{ $ne: 1 } है, तो उपयोगकर्ता पासवर्ड जानने के बिना पुनः प्राप्त किया जाएगा ($ne मतलब है नहीं के बराबर होती है 1)।

MongoDB ड्राइवर

आप उपयोग कर सकते हैं mongo-sanitize:

यह किसी भी कुंजी है कि इनपुट में '$' के साथ शुरू नहीं हटेगा, तो आप के बारे में चिंता किए बिना MongoDB करने के लिए इसे पारित कर सकते हैं दुर्भावनापूर्ण उपयोगकर्ता ओवरराइटिंग।

var sanitize = require('mongo-sanitize'); 

var name = sanitize(req.params.name); 
var password = sanitize(req.params.password); 

User.findOne({ 
    "name" : name, 
    "password" : password 
}, callback); 

नेवला ड्राइवर

के रूप में यह एक स्कीमा इस प्रकार है, अगर पासवर्ड एक स्ट्रिंग क्षेत्र है, यह वस्तु { $ne: 1 } स्ट्रिंग के लिए परिवर्तित कर देंगे और कोई नुकसान किया जाएगा। इस मामले में, आपको स्वच्छता की आवश्यकता नहीं है, बस उचित स्कीमा सेट करना याद रखें।

+0

मैंने अभी 'req.params.password = '{$ ne: 1}' के साथ यह कोशिश की और परिणाम नहीं मिला, क्या आप सुनिश्चित हैं कि स्ट्रिंग' req.params.password' है इसकी जेसन सामग्री पार्स की गई? –

+0

@ मोहम्मद अली नंबर, जेएसओएन स्वचालित रूप से पार्स नहीं किया जाएगा। समस्या यह है कि जब आप एक स्ट्रिंग '{$ ne: 1} '' के बजाय ऑब्जेक्ट '{$ ne: 1}' प्राप्त करते हैं। मैंने इस बारे में अपने ब्लॉग में अधिक जानकारी के साथ लिखा है: [लिंक] (https://zanon.io/posts/nosql-injection-in-mongodb)। उत्तर में – Zanon

+0

कंधे का उल्लेख किया जाना चाहिए? जैसा कि आपने मोंगोज़ ड्राइवर के बारे में लिखा है, वह मूल मोंगोडब ड्राइवर पर भी लागू होता है। और आप यह भी उल्लेख करने के लिए उपेक्षा करते हैं कि इस प्रकार को –

संबंधित मुद्दे