2010-09-20 17 views
9

के खिलाफ रक्षा की पहली पंक्ति के रूप में रेगेक्स मुझे एक्सएसएस के खिलाफ रक्षा की पहली पंक्ति के रूप में रेगेक्स था।एक्सएसएस

public static function standard_text($str) 
{ 
    // pL matches letters 
    // pN matches numbers 
    // pZ matches whitespace 
    // pPc matches underscores 
    // pPd matches dashes 
    // pPo matches normal puncuation 
    return (bool) preg_match('/^[\pL\pN\pZ\p{Pc}\p{Pd}\p{Po}]++$/uD', (string) $str); 
} 

यह वास्तव में Kohana 2.3 से है।

यह सार्वजनिक प्रवेश टेक्स्ट (कोई HTML कभी नहीं) पर चलता है, और यदि यह परीक्षण विफल हो जाता है तो इनपुट से इंकार कर देता है। पाठ हमेशा htmlspecialchars() (या अधिक विशेष रूप से, Kohana's flavour के साथ प्रदर्शित होता है, यह अन्य चीजों के साथ चार सेट जोड़ता है)। मैंने आउटपुट पर strip_tags() भी लगाया।

ग्राहक को समस्या थी जब वह ब्रांड्स के साथ कुछ पाठ दर्ज करना चाहता था। मैंने सहायक को संशोधित करने या विस्तार करने के बारे में सोचा, लेकिन मेरे पास एक माध्यमिक विचार भी था - अगर मैं डबल कोट्स की अनुमति देता हूं, तो क्या वास्तव में कोई कारण है कि मुझे बिल्कुल मान्य करने की आवश्यकता क्यों है?

क्या मैं सिर्फ आउटपुट पर भागने पर भरोसा कर सकता हूं?

उत्तर

5

खतरनाक XSS हमलों को फ़िल्टर करने के लिए रेगेक्स पर भरोसा करना कभी सुरक्षित नहीं है। और यद्यपि आप उन पर भरोसा नहीं कर रहे हैं, आउटपुट से बचने और इनपुट फ़िल्टरिंग, जब सही ढंग से उपयोग किया जाता है, तो हम सभी प्रकार के हमलों को मार देंगे। इसलिए, रेगेक्स को "रक्षा की पहली पंक्ति" के रूप में रखने में कोई बात नहीं है जब उनकी सहायता की वास्तव में आवश्यकता नहीं होती है। जैसे ही आप और आपके ग्राहक ने खोज की है, वे इस तरह इस्तेमाल होने पर केवल जटिल चीजें करते हैं।

लंबी कहानी छोटी: यदि आप अपने आउटपुट से बचने के लिए html_entities या htmlspecialchars का उपयोग करते हैं, तो आपको regexes की आवश्यकता नहीं है और न ही आपको वास्तव में strip_tags की आवश्यकता है।

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