2011-12-24 10 views
6

एचटीएमएल में, कई विशेष पात्र < > & ' " हैं जिनके पास डोम पार्सर का महत्व है। ये पात्र हैं जैसे PHP के htmlspecialchars एचटीएमएल इकाइयों में कनवर्ट करते हैं, इसलिए जब वे पार्स किए जाते हैं तो वे गलती से कुछ ट्रिगर नहीं करते हैं।क्या अन्य अनुक्रम ब्राउज़र HTML विशेष वर्णों के रूप में व्याख्या करते हैं?

प्रदर्शन किया अनुवाद कर रहे हैं:

  • '&' (एम्परसेंड) हो जाता है &amp;
  • " (दोहरे उद्धरण) &quot; हो जाता है जब ENT_NOQUOTES सेट नहीं है।
  • ' (सिंगल कोट) &#039; केवल बनता है जब ENT_QUOTES सेट होता है।
  • '<' (कम से कम) &lt;
  • '>' (से अधिक) हो जाता है &gt;

हालांकि, मुझे याद है कि IE6 की तरह पुराने ब्राउज़र में, वहाँ भी अन्य बाइट दृश्य थे हो जाता है जो ब्राउज़र के DOM पार्सर को interpret content as HTML पर ले गया।

क्या यह आज भी एक समस्या है? यदि आप अकेले इन 5 को फ़िल्टर करते हैं तो एक्सएसएस को रोकने के लिए पर्याप्त है?

उदाहरण के लिए, यहाँ (UTF-8 में) सभी जाना जाता चरित्र "<" HTML और जावास्क्रिप्ट में के संयोजन कर रहे हैं।

< 
%3C 
&lt 
&lt; 
&LT 
&LT; 
&#60 
&#060 
&#0060 
&#00060 
&#000060 
&#0000060 
&#60; 
&#060; 
&#0060; 
&#00060; 
&#000060; 
&#0000060; 
&#x3c 
&#x03c 
&#x003c 
&#x0003c 
&#x00003c 
&#x000003c 
&#x3c; 
&#x03c; 
&#x003c; 
&#x0003c; 
&#x00003c; 
&#x000003c; 
&#X3c 
&#X03c 
&#X003c 
&#X0003c 
&#X00003c 
&#X000003c 
&#X3c; 
&#X03c; 
&#X003c; 
&#X0003c; 
&#X00003c; 
&#X000003c; 
&#x3C 
&#x03C 
&#x003C 
&#x0003C 
&#x00003C 
&#x000003C 
&#x3C; 
&#x03C; 
&#x003C; 
&#x0003C; 
&#x00003C; 
&#x000003C; 
&#X3C 
&#X03C 
&#X003C 
&#X0003C 
&#X00003C 
&#X000003C 
&#X3C; 
&#X03C; 
&#X003C; 
&#X0003C; 
&#X00003C; 
&#X000003C; 
\x3c 
\x3C 
\u003c 
\u003C 

उत्तर

4

नहीं, मैं वास्तव में इस में देखा है जब मैं सीएसएस का उपयोग कर शोध किया गया था और स्वचालित रूप से सामग्री (my question) पर आधारित शैलियों आवंटित करने के लिए जिम्मेदार बताते हैं, और कम जवाब नहीं है। आधुनिक ब्राउज़र 'बाइट अनुक्रम' को HTML के रूप में उपयोग करने की अनुमति नहीं देते हैं। मैं हल्के से 'बाइट अनुक्रम' का उपयोग करता हूं क्योंकि सबसे अधिक जोखिम कोड बाइट एन्कोडेड मानों का उपयोग नहीं करता है।

एक्सएसएस साइट पर सूचीबद्ध उदाहरण विशेषता का उपयोग करने के बारे में हैं और जावास्क्रिप्ट को एक स्ट्रिंग के रूप में व्याख्या किया गया है जिसे निष्पादन की आवश्यकता होगी। लेकिन सूचीबद्ध भी &{alert('XSS')} जैसी चीजें हैं जो ब्रैकेट के भीतर कोड चलाती हैं, और यह कोड आधुनिक ब्राउज़रों में काम नहीं करता है।

लेकिन अपने दूसरे प्रश्न का उत्तर देने के लिए, नहीं, उन 5 को फ़िल्टर करना को XSS हमले को रोकने के लिए पर्याप्त नहीं है। अपने कोड को PHP HTML विशेष वर्ण कोड के माध्यम से हमेशा फेंक दें लेकिन वहां hundreds of byte codes that can be used है और आप वास्तव में कुछ भी गारंटी नहीं दे पाएंगे। इसे एक PHP फ़िल्टर (विशेष रूप से htmlentities()) के माध्यम से भेजना आपको HTML पर आउटपुट करते समय सटीक टेक्स्ट देगा (« के बजाय)। उस ने कहा, ज्यादातर मामलों में, आपके उपयोग के आधार पर, htmlspecialchars का उपयोग अधिकांश हमलों को कवर करने के लिए पर्याप्त है। इस पर निर्भर करता है कि आप इनपुट का उपयोग कैसे करेंगे, लेकिन अधिकांश भाग के लिए यह सुरक्षित रहेगा।

एक्सएसएस एक मुश्किल बात है जिसके लिए खाते हैं। एक सामान्य अच्छा नियम हमेशा उपयोगकर्ता द्वारा दर्ज की जाने वाली सभी चीज़ों को फ़िल्टर करता है। और ब्लैक-लिस्टिंग के बजाय सफेद-लिस्टिंग का उपयोग करें।यहां के बारे में आपकी बात क्या होगी इन मानों को ब्लैक-लिस्टिंग करना, जब यह मानना ​​हमेशा सुरक्षित होता है कि आपके उपयोगकर्ता दुर्भावनापूर्ण हैं और केवल कुछ चीजों की अनुमति देते हैं। यहाँ हमलावरों इनपुट, क्या "हटाएँ" और इससे पहले कि ')>

यह एस्केपिंग इस मामले में काम नहीं करेगा के बाद आती है क्योंकि हम गलत संदर्भ के लिए भाग निकले <button onclick="confirm('Are you sure you want to delete &#39;);alert(&#39;xss')> :

+0

omfg @ 'विशेषता =" और {चेतावनी ('एक्सएसएस')} "काम करने के लिए प्रयोग किया जाता है। – goat

+0

नेटस्केप दस्तावेज के साथ मिला आखिरी ब्राउज़र था जो वास्तव में काम करता था, हालांकि मुझे लगता है कि यह आईई 5 और कुछ अन्य लोगों में भी काम करता है, बस इतना ही दस्तावेज नहीं था। लेकिन हां, आधुनिक ब्राउज़र ऐसा करने में सक्षम होने से दूर चले गए, शायद कुछ कारणों से (सुरक्षा, सामग्री और कार्रवाई को अलग करना आदि)। – Ktash

+0

ठीक है, मेरे मामले में मुझे जितना संभव हो सके उतने पात्रों (विशेष रूप से यूनिकोड) का समर्थन करने की आवश्यकता है, इसलिए मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या ब्लॉक करना है क्योंकि मैं लगभग सभी यूनिकोड स्पेस को नहीं समझ सकता। सौभाग्य से, मेरे ज्ञान के लिए केवल छोटी ASCII अंतरिक्ष में खतरनाक सामान शामिल हैं - मुझे केवल आश्चर्य है कि यूनिकोड की गहराई में कुछ चीजें हैं जो * बाइट्स को ट्रिगर करने में मदद कर सकती हैं। ('preg_match_all ('/ \ p {एल} +/u', $ str, $ arr)')। मुझे खतरनाक अनुक्रमों की चर्चा करने की भी आवश्यकता है - इसलिए मैं सब कुछ संदिग्ध नहीं करना चाहता हूं। – Xeoncross

1

यहाँ एक उदाहरण है।

लघु xss रोकथाम में दिए गए संदर्भ से बचने का मतलब है। उपर्युक्त उदाहरण में हम एक HTML विशेषता संदर्भ के भीतर जावास्क्रिप्ट संदर्भ में हैं। ओडब्ल्यूएएसपी एक्सएसएस रोकथाम धोखा शीट देखें।

1

यह HTML में पाठ से बचने के लिए पर्याप्त होता है, लेकिन वहाँ HTML में संदर्भों हैं जहां भी पाठ खतरनाक है:

  • उपयोगकर्ताओं (, <a>, <img> में आदि) मनमाना यूआरएल बनाने के लिए अनुमति नहीं देते, क्योंकि वे javascript: या इसके कई बदलाव सम्मिलित कर सकते हैं। व्हाइटलिस्ट केवल ^https?://

  • एचटीएमएल-एस्केपिंग <script> (यह किसी भी तरह से इकाई से बचने) या किसी स्क्रिप्ट को निष्पादित करने वाले गुणों में पर्याप्त नहीं है (onclick, आदि)। उन लोगों के लिए आपको json_encode() की आवश्यकता है।

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