cgi.escape एक संभव पसंद की तरह लगता है। क्या यह अच्छी तरह से काम करता है? क्या कुछ ऐसा है जिसे बेहतर माना जाता है?
cgi.escape एक संभव पसंद की तरह लगता है। क्या यह अच्छी तरह से काम करता है? क्या कुछ ऐसा है जिसे बेहतर माना जाता है?
जवाबों:
cgi.escapeठीक है। यह बच जाता है:
< सेवा <> सेवा >& सेवा &यह सभी HTML के लिए पर्याप्त है।
संपादित करें: यदि आपके पास गैर-एससीआई चर है तो आप भी बचना चाहते हैं, एक अन्य एन्कोडेड दस्तावेज़ में शामिल करने के लिए जो एक अलग एन्कोडिंग का उपयोग करता है, जैसे क्रेग कहते हैं, बस उपयोग करें:
data.encode('ascii', 'xmlcharrefreplace')
डिकोड के लिए मत भूलना dataके लिए unicodeपहले जो कुछ भी एन्कोडिंग यह इनकोडिंग था का उपयोग कर।
हालांकि मेरे अनुभव में कि अगर आप अभी unicodeशुरू से ही हर समय काम करते हैं तो इस तरह की एनकोडिंग बेकार है । दस्तावेज़ हेडर ( utf-8अधिकतम संगतता के लिए) में निर्दिष्ट एन्कोडिंग के अंत में बस एनकोड करें ।
उदाहरण:
>>> cgi.escape(u'<a>bá</a>').encode('ascii', 'xmlcharrefreplace')
'<a>bá</a>
इसके अलावा ध्यान दें लायक (धन्यवाद ग्रेग) अतिरिक्त quoteपैरामीटर cgi.escapeलेता है। इसके साथ सेट करने पर True, cgi.escapeदोहरे उद्धरण चिह्नों ( ") से बच जाता है ताकि आप XML / HTML विशेषता में परिणामी मान का उपयोग कर सकें।
संपादित करें: ध्यान दें कि cgi.escape के पक्ष में पायथन 3.2 में पदावनत किया गया है html.escape, जो कि quoteसत्य को उस चूक के अलावा करता है ।
cgi.escapeफ़ंक्शन के माध्यम से सभी अविश्वसनीय डेटा चलाता हूं , तो सभी (ज्ञात) एक्सएसएस अटैच के खिलाफ सुरक्षा के लिए पर्याप्त है?
cgi.escape(yourunicodeobj).encode('ascii', 'xmlcharrefreplace') == '{{Measures 12 Ω"H x 17 5/8"W x 8 7/8"D. Imported.}}'- जैसा कि आप देख सकते हैं, एक्सिस वर्ण संदर्भ तालिका का उपयोग करके एन्कोडेड सभी गैर-एस्की यूनिकोड वर्णों के साथ, एसेटि बाइटस्ट्रिंग लौटता है।
पायथन 3.2 में एक नया htmlमॉड्यूल पेश किया गया था, जिसका उपयोग HTML मार्कअप से आरक्षित वर्णों से बचने के लिए किया जाता है।
इसका एक कार्य है escape():
>>> import html
>>> html.escape('x > 2 && x < 7 single quote: \' double quote: "')
'x > 2 && x < 7 single quote: ' double quote: "'
quote=True?
html.escape()डिफॉल्ट रूप से (इसके विपरीत cgi.quote(), यदि बताया गया है, तो डिफ़ॉल्ट रूप से ), उद्धरणों से बच जाता है और केवल बच जाता है। इस प्रकार, मुझे स्पष्ट रूप से एक विशेषता के साथ कुछ को इंजेक्ट करने के लिए एक वैकल्पिक पैरामीटर सेट करना होगा html.escape(), अर्थात इसे विशेषताओं के लिए असुरक्षित बनाने के लिए:t = '" onclick="alert()'; t = html.escape(t, quote=False); s = f'<a href="about.html" class="{t}">foo</a>'
escape()रहे हैं कि विशेषताओं को सुरक्षित बनाने के लिए पर्याप्त नहीं है। दूसरे शब्दों में, यह सुरक्षित नहीं है:<a href=" {{ html.escape(untrusted_text) }} ">
href एक कंटेंट सिक्योरिटी पॉलिसी सेट करना है जो इसे अस्वीकृत कर देती है।
html.escapeसिंगल कोट्स और डबल कोट्स से बच जाते हैं।
यदि आप URL में HTML से बचना चाहते हैं:
यह संभवतः ऐसा नहीं है कि ओपी चाहता था (यह प्रश्न स्पष्ट रूप से इंगित नहीं करता है कि किस संदर्भ में भागने का उपयोग किया जाना है), लेकिन पायथन की मूल लाइब्रेरी urllib में HTML संस्थाओं से बचने की एक विधि है जिसे सुरक्षित रूप से एक URL में शामिल करने की आवश्यकता है।
निम्नलिखित एक उदाहरण है:
#!/usr/bin/python
from urllib import quote
x = '+<>^&'
print quote(x) # prints '%2B%3C%3E%5E%26'
उत्कृष्ट मार्कअप कैफे पैकेज भी है ।
>>> from markupsafe import Markup, escape
>>> escape("<script>alert(document.cookie);</script>")
Markup(u'<script>alert(document.cookie);</script>')
markupsafeपैकेज में अच्छी तरह से इंजीनियर है, और शायद बहुमुखी और pythonic तरीका सबसे भागने IMHO, क्योंकि के बारे में जाने के लिए:
Markup) यूनिकोड (यानी) से प्राप्त एक वर्ग हैisinstance(escape('str'), unicode) == True__html__संपत्ति के साथ वस्तुओं ) और टेम्पलेट अधिभार ( __html_format__) का सम्मान करता है ।cgi.escape HTML टैग और चरित्र संस्थाओं से बचने के सीमित अर्थों में HTML से बचने के लिए अच्छा होना चाहिए।
लेकिन आपको एन्कोडिंग मुद्दों पर भी विचार करना पड़ सकता है: यदि आप जिस एचटीएमएल को उद्धृत करना चाहते हैं, उसमें एक विशेष एन्कोडिंग में गैर-एएससीआईआई अक्षर हैं, तो आपको यह भी ध्यान रखना होगा कि आप उद्धृत करते समय समझदारी से प्रतिनिधित्व करते हैं। शायद आप उन्हें संस्थाओं में बदल सकते हैं। अन्यथा आपको यह सुनिश्चित करना चाहिए कि गैर-ASCII वर्णों को दूषित करने से बचने के लिए "एन्कोडिंग" एचटीएमएल और उस पेज के बीच सही एन्कोडिंग अनुवाद किया जाता है।
कोई पुस्तकालय, शुद्ध अजगर, सुरक्षित रूप से HTML पाठ में पाठ से बच जाता है:
text.replace('&', '&').replace('>', '>').replace('<', '<'
).encode('ascii', 'xmlcharrefreplace')
<वसीयत से बच जाएगा&lt;
cgi.escape विस्तारितयह संस्करण सुधारता है cgi.escape। यह व्हाट्सएप और न्यूलाइन्स को भी संरक्षित करता है। एक unicodeस्ट्रिंग लौटाता है ।
def escape_html(text):
"""escape strings for display in HTML"""
return cgi.escape(text, quote=True).\
replace(u'\n', u'<br />').\
replace(u'\t', u' ').\
replace(u' ', u' ')
>>> escape_html('<foo>\nfoo\t"bar"')
u'<foo><br />foo "bar"'
सबसे आसान तरीका नहीं है, लेकिन फिर भी सीधा है। Cgi.escape मॉड्यूल से मुख्य अंतर - यह अभी भी ठीक से काम करेगा यदि &आपके पाठ में पहले से ही है । जैसा कि आप इसे टिप्पणियों से देखते हैं:
cgi.escape संस्करण
def escape(s, quote=None):
'''Replace special characters "&", "<" and ">" to HTML-safe sequences.
If the optional flag quote is true, the quotation mark character (")
is also translated.'''
s = s.replace("&", "&") # Must be done first!
s = s.replace("<", "<")
s = s.replace(">", ">")
if quote:
s = s.replace('"', """)
return s
रेगेक्स संस्करण
QUOTE_PATTERN = r"""([&<>"'])(?!(amp|lt|gt|quot|#39);)"""
def escape(word):
"""
Replaces special characters <>&"' to HTML-safe sequences.
With attention to already escaped characters.
"""
replace_with = {
'<': '>',
'>': '<',
'&': '&',
'"': '"', # should be escaped in attributes
"'": ''' # should be escaped in attributes
}
quote_pattern = re.compile(QUOTE_PATTERN)
return re.sub(quote_pattern, lambda x: replace_with[x.group(0)], word)
अजगर 2.7 में विरासत कोड के लिए, के माध्यम से यह कर सकते हैं BeautifulSoup4 :
>>> bs4.dammit import EntitySubstitution
>>> esub = EntitySubstitution()
>>> esub.substitute_html("r&d")
'r&d'