लघु संस्करण!
import re, cgi
tag_re = re.compile(r'(<!--.*?-->|<[^>]*>)')
# Remove well-formed tags, fixing mistakes by legitimate users
no_tags = tag_re.sub('', user_input)
# Clean up anything else by escaping
ready_for_web = cgi.escape(no_tags)
रेगेक्स स्रोत: मार्कअपसेफ़ । उनका संस्करण HTML संस्थाओं को भी संभालता है, जबकि यह त्वरित नहीं है।
मैं केवल टैग क्यों नहीं छीन सकता और इसे छोड़ दूं?
यह लोगों को <i>italicizing</i>
चीजों से दूर रखने के लिए एक चीज है , बिना किसी चीज को i
इधर-उधर तैरते हुए छोड़ना । लेकिन यह मनमाना इनपुट लेने और इसे पूरी तरह से हानिरहित बनाने के लिए एक और है। इस पृष्ठ की अधिकांश तकनीकें अस्पष्ट टिप्पणियों ( <!--
) और कोण-कोष्ठक जैसी चीजों को छोड़ देंगी जो टैग का हिस्सा नहीं हैं ()blah <<<><blah
) बरकरार हैं। HTMLParser संस्करण भी पूर्ण टैग छोड़ सकते हैं, अगर वे एक असंगत टिप्पणी के अंदर हैं।
यदि आपका टेम्पलेट है तो क्या होगा {{ firstname }} {{ lastname }}
? firstname = '<a'
और lastname = 'href="http://evil.com/">'
इस पृष्ठ पर हर टैग स्ट्रिपर (@Medeiros को छोड़कर!) के माध्यम से जाने देंगे, क्योंकि वे अपने आप ही पूर्ण टैग नहीं हैं। सामान्य HTML टैग्स को अलग करना पर्याप्त नहीं है।
Django के strip_tags
, इस प्रश्न के शीर्ष उत्तर का एक उन्नत (अगला शीर्षक) देखें, निम्नलिखित चेतावनी देता है:
परिणामी स्ट्रिंग HTML सुरक्षित होने के बारे में बिल्कुल कोई गारंटी नहीं दी गई है। तो strip_tags
पहले से बचने के बिना कॉल के परिणाम को कभी भी सुरक्षित न करें, उदाहरण के लिए escape()
।
उनकी सलाह का पालन करें!
HTMLParser के साथ टैग हटाने के लिए, आपको इसे कई बार चलाना होगा।
इस प्रश्न के शीर्ष उत्तर को दरकिनार करना आसान है।
इस स्ट्रिंग को देखें ( स्रोत और चर्चा ):
<img<!-- --> src=x onerror=alert(1);//><!-- -->
पहली बार HTMLParser इसे देखता है, यह नहीं बता सकता है कि <img...>
यह एक टैग है। यह टूटा हुआ दिखता है, इसलिए HTMLParser इससे छुटकारा नहीं पाता है। यह केवल <!-- comments -->
आपको छोड़ कर, बाहर ले जाता है
<img src=x onerror=alert(1);//>
मार्च, 2014 में Django परियोजना के लिए इस समस्या का खुलासा किया गया था। उनके पुराने strip_tags
अनिवार्य रूप से इस प्रश्न के शीर्ष उत्तर के समान थे। उनका नया संस्करण मूल रूप से इसे लूप में चलाता है जब तक कि इसे फिर से चलाने से स्ट्रिंग में बदलाव नहीं होता है:
# _strip_once runs HTMLParser once, pulling out just the text of all the nodes.
def strip_tags(value):
"""Returns the given HTML with all tags stripped."""
# Note: in typical case this loop executes _strip_once once. Loop condition
# is redundant, but helps to reduce number of executions of _strip_once.
while '<' in value and '>' in value:
new_value = _strip_once(value)
if len(new_value) >= len(value):
# _strip_once was not able to detect more tags
break
value = new_value
return value
बेशक, यह कोई भी मुद्दा नहीं है यदि आप हमेशा के परिणाम से बच जाते हैं strip_tags()
।
अपडेट 19 मार्च, 2015 : 1.4.20, 1.6.11, 1.7.7, और 1.8c1 से पहले Django के संस्करणों में एक बग था। ये संस्करण स्ट्रिप_टैग्स () फ़ंक्शन में एक अनंत लूप दर्ज कर सकते हैं। निश्चित संस्करण ऊपर पुन: प्रस्तुत किया गया है। अधिक जानकारी यहाँ ।
नकल या उपयोग करने के लिए अच्छी चीजें
मेरा उदाहरण कोड HTML एंटिटीज को हैंडल नहीं करता है - Django और MarkupSafe पैकेज्ड वर्जन।
मेरा उदाहरण कोड क्रॉस-साइट स्क्रिप्टिंग की रोकथाम के लिए उत्कृष्ट मार्कअप कैफे पुस्तकालय से निकाला गया है । यह सुविधाजनक और तेज़ है (C स्पीडअप के साथ अपने मूल पायथन संस्करण के लिए)। यह Google App Engine में शामिल है , और इसका उपयोग Jinja2 (2.7 और ऊपर) द्वारा किया गया है , Mako, Pylons और बहुत कुछ द्वारा किया जाता है। यह आसानी से Django 1.7 से Django टेम्प्लेट के साथ काम करता है।
हाल के संस्करण से Django की स्ट्रिप_टैग्स और अन्य HTML उपयोगिताओं अच्छे हैं, लेकिन मैं उन्हें MarkupSafe की तुलना में कम सुविधाजनक लगता हूं। वे बहुत आत्म-निहित हैं, आप इस फ़ाइल से जो कुछ भी चाहते हैं उसे कॉपी कर सकते हैं ।
यदि आपको लगभग सभी टैग्स को स्ट्रिप करने की आवश्यकता है , तो ब्लीच लाइब्रेरी अच्छी है। आपके पास यह नियम हो सकते हैं जैसे "मेरे उपयोगकर्ता चीजों को इटैलिक कर सकते हैं, लेकिन वे iframes नहीं बना सकते हैं।"
अपने टैग स्ट्रिपर के गुणों को समझें! उस पर फ़ज़ी टेस्ट चलाएं! इस कोड को मैंने इस उत्तर के लिए अनुसंधान करने के लिए उपयोग किया है।
शीश नोट - यह सवाल स्वयं कंसोल पर छपाई के बारे में है, लेकिन यह "स्ट्रिंग से अजगर पट्टी एचटीएमएल" के लिए शीर्ष Google परिणाम है, इसलिए वेब के बारे में यह जवाब 99% है।
&
) को कैसे संभालना है । आप या तो 1) उन्हें टैग के साथ हटा सकते हैं (अक्सर अवांछनीय, और अनावश्यक के रूप में वे सादे पाठ के बराबर होते हैं), 2) उन्हें अपरिवर्तित छोड़ दें (यदि उपयुक्त पाठ एचटीएमएल संदर्भ में वापस जा रहा है तो एक उपयुक्त समाधान) या 3 ) उन्हें सादे पाठ को डिकोड करें (यदि छीन हुआ पाठ डेटाबेस या किसी अन्य गैर-HTML संदर्भ में जा रहा है, या यदि आपका वेब ढांचा स्वचालित रूप से आपके लिए पाठ से बचने वाला HTML निष्पादित करता है)।