2009-10-28 16 views
18

मैं जावास्क्रिप्ट में लिखे गए एक साधारण HTML sanitizer की तलाश में हूं। इसे 100% एक्सएसएस सुरक्षित होने की आवश्यकता नहीं है।जावास्क्रिप्ट में सरल HTML sanitizer

मैं अपनी वेबसाइट पर मार्कडाउन और डब्लूएमडी मार्कडाउन संपादक (जीथ्यूब से एसओ मास्टर शाखा) लागू कर रहा हूं। समस्या यह है कि लाइव पूर्वावलोकन में दिखाया गया HTML फ़िल्टर नहीं किया गया है, जैसे कि यहां SO पर। मैं जावास्क्रिप्ट में लिखे गए एक साधारण/त्वरित HTML सैनिटाइज़र की तलाश में हूं ताकि मैं पूर्वावलोकन विंडो की सामग्री को फ़िल्टर कर सकूं।

पूर्ण XSS सुरक्षा के साथ पूर्ण पार्सर की आवश्यकता नहीं है। मैं आउटपुट को सर्वर पर वापस नहीं भेज रहा हूं। मैं डेटाबेस में परिणाम संग्रहीत करने से पहले मैं सर्वर पर मार्कडाउन भेज रहा हूं जहां मैं एक उचित, पूर्ण HTML sanitizer का उपयोग करता हूं।

Google मेरे लिए बिल्कुल बेकार है। मुझे उपयोगकर्ता द्वारा जेनरेट किए गए HTML से सभी प्रकार की सर्वर-साइड भाषाओं में जावास्क्रिप्ट को फ़िल्टर करने के तरीके पर सैकड़ों (अक्सर गलत) आलेख मिलते हैं।

अद्यतन

मैं क्यों मैं इस की जरूरत है थोड़ा बेहतर तरीका बताएंगे। मेरी वेबसाइट में एक संपादक है जो यहां स्टैक ओवरफ्लो पर एक जैसा है। मार्कडाउन सिंटैक्स और इसके नीचे एक पूर्वावलोकन विंडो दर्ज करने के लिए एक टेक्स्ट क्षेत्र है जो आपको दिखाता है कि इसे सबमिट करने के बाद यह कैसा दिखाई देगा।

जब उपयोगकर्ता कुछ सबमिट करता है, तो उसे मार्कडाउन प्रारूप में सर्वर पर भेजा जाता है। सर्वर इसे HTML में परिवर्तित करता है और फिर HTML को साफ करने के लिए उस पर एक HTML sanitizer चलाता है। मार्कडाउन मनमाने ढंग से HTML की अनुमति देता है इसलिए मुझे इसे साफ़ करने की आवश्यकता है। उदाहरण के लिए, उपयोगकर्ता इस प्रकार कुछ टाइप करता है:

<script>alert('Boo!');</script> 

मार्कडाउन कनवर्टर इसे HTML से स्पर्श नहीं करता है। एचटीएमएल सैनिटाइज़र इसे पट्टी कर देगा ताकि स्क्रिप्ट तत्व खत्म हो गया हो।

लेकिन पूर्वावलोकन विंडो में ऐसा नहीं होता है। पूर्वावलोकन विंडो केवल मार्कडाउन को HTML में परिवर्तित करती है लेकिन इसे संचरित नहीं करती है। तो, पूर्वावलोकन विंडो में एक स्क्रिप्ट तत्व होगा। इसका मतलब है कि पूर्वावलोकन विंडो सर्वर पर वास्तविक प्रतिपादन से अलग है।

मैं इसे ठीक करना चाहता हूं, इसलिए मुझे एक त्वरित और गंदे जावास्क्रिप्ट HTML sanitizer की आवश्यकता है। बुनियादी तत्व/विशेषता ब्लैकलिस्टिंग और श्वेतसूची के साथ कुछ सरल होगा। इसे XSS सुरक्षित होने की आवश्यकता नहीं है क्योंकि XSS सुरक्षा सर्वर-साइड HTML sanitizer द्वारा की जाती है।

यह सुनिश्चित करने के लिए है कि पूर्वावलोकन विंडो वास्तविक प्रतिपादन 99.99% के वास्तविक प्रतिपादन से मेल खाएगी, जो मेरे लिए पर्याप्त है।

क्या आप मदद कर सकते हैं? अग्रिम में धन्यवाद!

+3

एफडब्ल्यूआईडब्ल्यू, जब पूर्वावलोकन प्रकाशित नहीं होता है तो मुझे इससे नफरत है। – Ms2ger

+1

@ ms2ger: यही कारण है कि मुझे HTML sanitizer की आवश्यकता है, ताकि पूर्वावलोकन बैक-एंड पर सर्वर के साथ मेल खाए। –

+0

क्या यह हमलावरों को उनके ब्राउज़र में उनके हमलों का परीक्षण करने की अनुमति देने की समस्या नहीं है, जबकि आप उनके किसी भी प्रयास को नहीं देखते हैं? – siukurnin

उत्तर

9

आप इस सवाल में सिफारिश की एक पर एक नजर है चाहिए Sanitize/Rewrite HTML on the Client Side

और बस यकीन है कि आप इस एक How to prevent Javascript injection attacks within user-generated HTML

+1

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

-1

के जवाब की समीक्षा करें XSS के बारे में और अधिक करने की जरूरत नहीं है, होना करने के लिए मेरे फ़ंक्शन के लिए मैंने केवल देखभाल की है कि स्ट्रिंग खाली नहीं है और इसमें केवल अल्फान्यूमेरिक वर्ण हैं। यह सादे जेएस और कोई तीसरी पुस्तकालय या कुछ भी उपयोग करता है। इसमें एक लंबा रेगेक्स है, लेकिन यह नौकरी करता है;) आप इस पर निर्माण कर सकते हैं लेकिन आपका रेगेक्स कुछ और हो सकता है '< स्क्रिप्ट> | </स्क्रिप्ट> '(पात्रों के साथ जहां आवश्यक हो बच निकला, और रिक्त स्थान घटाएं)।;)

var validateString = function(string) { 

     var validity = true; 

     if(string == '') { validity = false; } 

     if(string.match(/[ |<|,|>|\.|\?|\/|:|;|"|'|{|\[|}|\]|\||\\|~|`|!|@|#|\$|%|\^|&|\*|\(|\)|_|\-|\+|=]+/) != null) { 

      validity = false; 
     } 

     return validity; 
    }