2011-03-17 5 views
23

का उपयोग क्यों करें यदि मैं अपने डीबी आवेषण को स्वच्छ कर रहा हूं, और HTML से बचने के लिए htmlentities($text, ENT_COMPAT, 'UTF-8') के साथ लिखता हूं - क्या xss_clean के साथ इनपुट को फ़िल्टर करने का कोई बिंदु है? यह अन्य लाभ क्या देता है?कोडइग्निटर - xss_clean

+0

'htmlentities ($ पाठ, ENT_COMPAT, 'UTF-8')', कोई भी इस का उपयोग करना चाहिए XSS रोक का एक अच्छा तरीका नहीं है। – rook

+5

'htmlentities' HTML-इंजेक्शन के खिलाफ बिल्कुल प्रमाण है, हालांकि' ENT_COTPAT' की बजाय 'ENT_QUOTES' की आवश्यकता है, यदि आपने कभी भी एकल कोट विशेषता वितरणकर्ताओं का उपयोग किया है। 'htmlspecialchars' आमतौर पर 'htmlentities' के लिए बेहतर है, हालांकि, इसके पास वर्णमाला को गड़बड़ करने का कम मौका है। कोडइग्निटर का 'xss_clean' स्ट्रिंग हैंडलिंग का गठन करने वाले गलत तरीके से गलतफहमी से भरा एक बेकार कार्गो-पंथ-प्रोग्रामिंग आपदा क्षेत्र है। – bobince

उत्तर

37

xss_clean() व्यापक, और भी मूर्खतापूर्ण है। इस फ़ंक्शन का 9 0% xss को रोकने के लिए कुछ भी नहीं करता है। जैसे कि alert शब्द ढूंढ रहे हैं लेकिन document.cookie नहीं। कोई भी हैकर अपने शोषण में alert का उपयोग करने जा रहा है, वे एक्सएसएस के साथ कुकी को हाइजैक करने जा रहे हैं या एक्सएचआर बनाने के लिए सीएसआरएफ टोकन पढ़ रहे हैं।

हालांकि htmlentities() या htmlspecialchars() चल साथ यह अनावश्यक है। एक मामले में जहां xss_clean() फिक्स मुद्दा और htmlentities($text, ENT_COMPAT, 'UTF-8') विफल रहता है निम्नलिखित है:

<?php 
print "<img src='$var'>"; 
?> 

एक साधारण POC है:

http://localhost/xss.php?var=http://domain/some_image.gif '% 20onload = चेतावनी (/ XSS /)

यह onload= इवेंट हैंडलर को छवि टैग में जोड़ देगा। Xss के इस रूप को रोकने के लिए एक विधि htmlspecialchars($var,ENT_QUOTES); है या इस मामले में xss_clean() भी इसे रोक देगा।

हालांकि, xss_clean() प्रलेखन से उद्धृत:

कुछ भी कभी 100% सरल, निश्चित रूप से है, लेकिन मैं कुछ भी प्राप्त करने में सक्षम फिल्टर पारित नहीं किया गया है।

कहा जा रहा है, XSS एक output problemनहीं एक input problem है। उदाहरण के लिए यह फ़ंक्शन इस बात पर ध्यान नहीं दे सकता है कि चर पहले से ही <script> टैग या ईवेंट हैंडलर के भीतर है। यह डोम आधारित एक्सएसएस को भी रोकता नहीं है। सर्वोत्तम फ़ंक्शन का उपयोग करने के लिए आपको पर विचार करने की आवश्यकता है कि आप डेटा डेटा का उपयोग कैसे कर रहे हैं। इनपुट पर सभी डेटा फ़िल्टर करना खराब अभ्यास है। न केवल यह असुरक्षित है बल्कि यह डेटा को दूषित करता है जो तुलना को मुश्किल बना सकता है।

+0

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

+0

@Dan Searle यदि आप एचटीएमएल का एक सुरक्षित सब-सेट चाहते हैं तो आपको htmloutifier.org – rook

+4

एक्सएसएसएस * आउटपुट समस्या है और एक इनपुट समस्या नहीं है, यही कारण है कि 'xss_clean() 'कुछ * कभी नहीं हो सकता है एक्सएसएस समस्याओं को हल करने के लिए एक विश्वसनीय दृष्टिकोण (और 'xss_clean()' एंटी-एक्सएसएस उपकरण के निम्न, निम्न मानकों द्वारा भी एक हंसमुख रूप से भयानक कार्यान्वयन है)। मुझे आश्चर्य है कि आप इसे अपने पहले वाक्य में आउटपुट-स्तर से बचने के लिए एक बेहतर विकल्प के रूप में समर्थन दे रहे हैं। – bobince

3

हां आपको अभी भी इसका उपयोग करना चाहिए, मैं आम तौर पर इसे कम से कम सार्वजनिक सामना इनपुट पर इसका उपयोग करने का नियम बना देता हूं, जिसका अर्थ है कि कोई भी इनपुट जो कोई भी एक्सेस कर सकता है और जमा कर सकता है।

आम तौर पर डीबी प्रश्नों के लिए इनपुट sanitizing एक पक्ष प्रभाव की तरह लगता है के रूप में समारोह के वास्तविक उद्देश्य को Cross-site Scripting Attacks को रोकने के लिए है।

मैं हर चरण xss_clean लेता है, लेकिन मैं आपको बताऊंगा कि यह आपके द्वारा उल्लिखित कुछ चरणों से अधिक करता है, मेरे पास pastied the source of the xss_clean function है ताकि आप स्वयं को देख सकें, यह पूरी तरह से है टिप्पणी की।

3

मैं XSS शुद्धि करने के लिए http://htmlpurifier.org/ का उपयोग कर की सिफारिश करेंगे। मैं अपने कोडइग्निटर इनपुट क्लास को विस्तारित करने के लिए विस्तारित करने पर काम कर रहा हूं।

+0

आप htmlPifier के लिए सीआई विस्तारित करने में सक्षम थे? –

+1

क्षमा करें, मैं लंबे समय से लार्वेल पर चले गए हैं। :) – Anthony

+0

https://github.com/refringe/codeigniter-htmlpurifier – qwertzman

6

आपके मामले में, "stricter methods are fine, and lighter weight"। कोडइग्निटर डेवलपर्स एक अलग उपयोग मामले के लिए xss_clean() का इरादा रखते हैं, "एक टिप्पणी प्रणाली या मंच जो 'सुरक्षित' HTML टैग को अनुमति देता है"।यह दस्तावेज़ीकरण से स्पष्ट नहीं है, जहां xss_clean को उपयोगकर्ता नाम फ़ील्ड पर लागू किया गया है।

xss_clean() का कभी भी उपयोग करने का एक और कारण नहीं है, जिसे अब तक स्टैक ओवरफ्लो पर हाइलाइट नहीं किया गया है। xss_clean() 2011 और 2012 के दौरान टूट गया था, और पूरी तरह से ठीक करना असंभव है। कम से कम एक पूर्ण रीडिज़ाइन के बिना, जो नहीं हुआ। At the moment, it's still vulnerable to strings like this:

<a href="j&#x26;#x41;vascript:alert%252831337%2529">Hello</a> 

xss_clean का वर्तमान क्रियान्वयन() को प्रभावी ढंग से पूरी स्ट्रिंग के लिए urldecode() और html_entity_decode() लगाने से शुरू होता है। इसकी आवश्यकता है ताकि यह "जावास्क्रिप्ट:" जैसी चीज़ों के लिए एक बेवकूफ जांच का उपयोग कर सके। अंत में, यह डीकोडेड स्ट्रिंग देता है।

एक हमलावर बस अपने शोषण को दो बार एन्कोड कर सकता है। इसे xss_clean() द्वारा एक बार डीकोड किया जाएगा, और साफ़ के रूप में पास किया जाएगा। फिर आपके पास एक सिंगल-एन्कोडेड शोषण है, जो ब्राउज़र में निष्पादन के लिए तैयार है।

मैं इन चेक को "बेवकूफ़" और अपरिहार्य कहता हूं क्योंकि वे नियमित रूप से नियमित अभिव्यक्तियों पर निर्भर हैं। एचटीएमएल एक नियमित भाषा नहीं है। You need a more powerful parser to match the one in the browser; xss_clean() में ऐसा कुछ भी नहीं है। हो सकता है कि एचटीएमएल के सबसेट को श्वेतसूची में डालना संभव हो, जो नियमित रूप से अभिव्यक्तियों के साथ स्पष्ट रूप से ले जाता है। हालांकि, वर्तमान xss_clean() बहुत ब्लैकलिस्ट है।

1

यदि आप चाहते हैं कि फ़िल्टर हर बार पोस्ट या कुकी डेटा का सामना कर लेता है तो आप इसे अपने एप्लिकेशन/config/config.php फ़ाइल खोलकर इसे सक्षम कर सकते हैं और इसे सेट कर सकते हैं: $ config ['global_xss_filtering'] = TRUE;

आप अपने एप्लिकेशन/config/config.php फ़ाइल को खोलकर सीएसआरएफ सुरक्षा सक्षम कर सकते हैं और इसे सेट कर सकते हैं: $ config ['csrf_protection'] = TRUE; अधिक जानकारी के लिए

, कृपया निम्नलिखित लिंक पर देखें।

https://ellislab.com/codeigniter/user-guide/libraries/security.html