2012-11-08 12 views
8

को रोकना हमने हाल ही में डीओएम एक्सएसएस हमलों के लिए परीक्षण किया गया है, और विफल रहा है, जिसे हमने किसी और के कोड पर रखा है। मूल रूप से यूआरएल टुकड़े सीधे jQuery चयनकर्ताओं में पारित किया जा रहा है और जावास्क्रिप्ट सक्रिय करने इंजेक्ट किया जा करने के लिए है, तो जैसे:डीओएम एक्सएसएस

"http://website.com/#%3Cimg%20src=x%20onerror=alert%28/XSSed/%29%3E)" 
$(".selector [thing="+window.location.hash.substr(1)+"]"); 

समस्या यह है कि यह उनकी स्क्रिप्ट के दौरान होने वाली है और प्रतिगमन परीक्षण के एक बहुत जरूरत है जैसे कि ठीक करने के लिए होता है अगर हम आंकड़ों से बचते हैं तो अगर डेटा मेल नहीं खाएगा तो बयान सही नहीं होंगे।

प्रश्न में जावास्क्रिप्ट फ़ाइल कई छोटी फाइलों से निर्माण समय पर संयोजित है, इसलिए इसे ठीक करना और भी मुश्किल हो जाता है।

क्या इन डीओएम एक्सएसएस हमलों को कुछ वैश्विक कोड के साथ रोकने और प्रत्येक उदाहरण को डीबग किए बिना रोकने का कोई तरीका है।


मैं प्रस्तावित हम आम XSS हमलों में इस्तेमाल किया वर्ण का पता लगाने के स्क्रिप्ट के शीर्ष पर एक छोटे से नियमित अभिव्यक्ति जोड़ सकते हैं और यदि यह सच रिटर्न बस स्क्रिप्ट को मारने के लिए है।

var xss = window.location.href.match(/(javascript|src|onerror|%|<|>)/g); 

if(xss != null) return; 

यह काम पर प्रतीत होता है लेकिन मैं समाधान से 100% खुश नहीं हूं। क्या किसी के पास बेहतर समाधान या कोई उपयोगी अंतर्दृष्टि है जो वे पेश कर सकते हैं?

+0

हां, आपको इसे अपनी सभी फाइलों को ठीक करने की आवश्यकता होगी। "डेटा ब्रेक से बचने पर" बयान से आपका क्या मतलब है? और यूआरएल हैश में संग्रहीत jQuery चयनकर्ता क्यों थे? – Bergi

+0

असल में उनके अंकन जीईटी पैरा और यूआरएल खंड का उपयोग करते हैं, भले ही प्रत्येक भार एक पोस्ट बैक है। फिर वे इस जानकारी को सीधे पार्सिंग के बिना jQuery में उपभोग करते हैं और वहां बहुत तर्क है जहां (param [0] == "str") इत्यादि। इससे बचने के लिए मुझे दोनों मानों से बचना होगा। – sidonaldson

+0

हां, आपको उचित राउटर और राज्य <-> चयनकर्ता मैपर – Bergi

उत्तर

6

आप नियमित अभिव्यक्ति समाधान है, जो आदर्श से दूर है पर कायम लेकिन हो सकता है सबसे अच्छा विकल्प आपके कमी को देखते हुए हैं: बल्कि एक नियमित रूप से दुर्भावनापूर्ण हैश मिलान अभिव्यक्ति (/(javascript|src|onerror|%|<|>)/g), मैं एक नियमित रूप से परिभाषित करेंगे को परिभाषित करने से

अभिव्यक्ति मिलान ध्वनि हैश (उदाहरण के लिए /^[\w_-]*$/)।

यह झूठी-सकारात्मक त्रुटियों से बच जाएगा (उदा। src_records), यह स्पष्ट करें कि अधिकृत क्या है और क्या नहीं है, और अधिक जटिल इंजेक्शन तंत्र को अवरुद्ध करें।

+2

तो सच है। इसे ब्लैकलिस्ट के बजाय श्वेतसूची बनाएं! – Bergi

+0

मुझे यह पसंद है।तो कुछ एक्सएसएस तकनीकों को इंगित करने के बजाय स्वीकार्य वर्णों की एक सफेद सूची बनाएं। – sidonaldson

+0

मैंने इसे खोज और हैश तारों से मेल खाने के लिए संशोधित किया है ... var urlSearch = window.location.search.match (/^[- \ w _ और? = +] * $ /); var urlHash = window.location.hash.match (/^[- \ w _ और = + #] * $ /); अगर (urlSearch == null || urlHash == null) वापसी; – sidonaldson

0

आपकी समस्या उस jQuery के इनपुट स्ट्रिंग के कारण होती है जिसे न केवल चयनकर्ता के रूप में HTML के रूप में माना जा सकता है।

jQuery के बजाय मूल document.querySelector() का उपयोग करें।

यदि आईई 7 के लिए समर्थन आपके लिए महत्वपूर्ण है, तो आप Sizzle चयनकर्ता इंजन की कोशिश कर सकते हैं, जो कि jQuery के विपरीत और मूल querySelector() के समान है, इनपुट स्ट्रिंग को किसी चयनकर्ता से अलग नहीं समझता है।

+0

यह एक सहायता नहीं है क्योंकि मैं एक पुनर्लेख से बचने की कोशिश कर रहा हूं। (लेकिन शुद्ध दृष्टिकोण से यह सही है) – sidonaldson

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