উত্তর:
cgi.escapeভাল. এটি পালিয়ে যায়:
< প্রতি <> প্রতি >& প্রতি &সমস্ত HTML এর জন্য এটি যথেষ্ট for
সম্পাদনা: আপনার যদি অ-এস্কি অক্ষর থাকে তবে আপনি পালাতেও চান, অন্য কোনও এনকোডড ডকুমেন্টের অন্তর্ভুক্তির জন্য যা আলাদা এনকোডিং ব্যবহার করে, যেমন ক্রেগ বলেছেন, কেবল ব্যবহার করুন:
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এছাড়াও ডাবল উদ্ধৃতি অক্ষর পালাতে ( ") যাতে আপনি আপনার এক্সএমএল / এইচটিএমএল অ্যাট্রিবিউট ফলে মান ব্যবহার করতে পারেন।
সম্পাদনা: দ্রষ্টব্য যে সিজি.ইসকেপ পাইথন ৩.২ এ অনুগ্রহ 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.}}'- যেমন আপনি দেখতে পাচ্ছেন, এক্সএমএল অক্ষর রেফারেন্স সারণীটি ব্যবহার করে সমস্ত নন-এসসিআই ইউনিকোড অক্ষর এনকোডযুক্ত এক্সপ্রেশনটি ascii বাইট্রেস্টিং প্রত্যাবর্তন করে।
পাইথন ৩.২-তে একটি নতুন 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- এ অন্তর্ভুক্ত করা দরকার need
নিচেরটি একটি উদাহরণ:
#!/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প্যাকেজ ভাল engineered হয়, এবং সম্ভবত বহুমুখী এবং Pythonic পথ সবচেয়ে পলায়নপর এই প্রোগ্রামটিতে, কারণ সম্পর্কে যেতে:
Markup) হ'ল একটি ক্লাস যা ইউনিকোড থেকে উত্পন্ন (isinstance(escape('str'), unicode) == True__html__সম্পত্তি সহ বস্তু ) এবং টেমপ্লেট ওভারলোডগুলি ( __html_format__) সম্মান করে ।cgi.escape এইচটিএমএল ট্যাগ এবং চরিত্র সত্ত্বাগুলি পালানোর সীমিত অর্থে এইচটিএমএল থেকে বাঁচতে ভাল হওয়া উচিত।
তবে আপনাকে এনকোডিংয়ের বিষয়গুলিও বিবেচনা করতে হবে: আপনি যেই এইচটিএমএলটি উদ্ধৃত করতে চান তার যদি কোনও নির্দিষ্ট এনকোডিং-এ অ-এএসসিআইআই অক্ষর থাকে, তবে আপনাকেও যত্নবান হতে হবে যে আপনি উদ্ধৃতি দেওয়ার সময় সংবেদনশীলভাবে উপস্থাপন করছেন। সম্ভবত আপনি তাদের সত্তা রূপান্তর করতে পারে। অন্যথায় আপনার নিশ্চিত হওয়া উচিত যে অ-ASCII অক্ষরগুলি দূষিত করা এড়াতে "উত্স" এইচটিএমএল এবং এটি এমবেড করা পৃষ্ঠার মধ্যে সঠিক এনকোডিং অনুবাদগুলি করা হয়েছে।
কোনও লাইব্রেরি নেই, খাঁটি পাইথন, নিরাপদে এইচটিএমএল পাঠ্যে পাঠানো যায় না:
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
regex সংস্করণ
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)
পাইথন ২.7-এ লিগ্যাসি কোডের জন্য এটি বিউটিফুলসপ এমপি 4 এর মাধ্যমে করতে পারেন :
>>> bs4.dammit import EntitySubstitution
>>> esub = EntitySubstitution()
>>> esub.substitute_html("r&d")
'r&d'