मैं ग्राहक से कुछ HTML इनपुट sanitize और XSS-proof को प्रमाणित करने का प्रयास कर रहा हूं। मैं खूबसूरत सूप के साथ पायथन 2.6 का उपयोग कर रहा हूँ। मैं इनपुट को पार्स करता हूं, श्वेतसूची में नहीं सभी टैग और विशेषताओं को पट्टी करता हूं, और पेड़ को एक स्ट्रिंग में बदल देता हूं।सुंदर सूप आउटपुट एचटीएमएल इकाइयों को कैसे बनाया जाए?
हालांकि ...
>>> unicode(BeautifulSoup('text < text'))
u'text < text'
जो मुझे करने के लिए मान्य HTML तरह नहीं दिखता है। और मेरे टैग स्ट्रिपर के साथ, यह गंदगी के सभी प्रकार के लिए रास्ता खुल जाता है:
>>> print BeautifulSoup('<<script></script>script>alert("xss")<<script></script>script>').prettify()
<
<script>
</script>
script>alert("xss")<
<script>
</script>
script>
<script></script>
जोड़े को हटा दिया जाएगा, और क्या रहता है न केवल एक XSS हमले, लेकिन फिर भी मान्य HTML के रूप में अच्छी तरह से है।
स्पष्ट समाधान सभी <
वर्णों को <
से प्रतिस्थापित करना है, जो पार्सिंग के बाद, टैग से संबंधित नहीं हैं (और >&'"
के समान)। लेकिन Beautiful Soup documentation केवल इकाइयों की पार्सिंग का उल्लेख करता है, न कि उनके उत्पादन। बेशक मैं सभी NavigableString
नोड्स पर एक प्रतिस्थापन चला सकता हूं, लेकिन चूंकि मुझे कुछ याद आ सकता है, इसलिए मैं कुछ कोशिश करने और परीक्षण कोड को काम करने देता हूं।
सुंदर सूप डिफ़ॉल्ट रूप से <
(और अन्य जादू वर्ण) से क्यों नहीं बचते हैं, और मैं इसे कैसे कर सकता हूं?
एनबी। मैंने lxml.html.clean
पर भी देखा है। ऐसा लगता है कि ब्लैकलिस्टिंग के आधार पर काम करना प्रतीत होता है, श्वेतसूची नहीं, इसलिए यह मेरे लिए बहुत सुरक्षित नहीं लगता है। टैग श्वेतसूचीबद्ध किया जा सकता है, लेकिन गुण नहीं कर सकते हैं, और यह मेरे स्वाद के लिए बहुत अधिक विशेषताओं की अनुमति देता है (उदा। tabindex
)। इसके अलावा, यह इनपुट पर AssertionError
देता है। अच्छा नही।
एचटीएमएल को साफ करने के अन्य तरीकों के सुझाव भी बहुत स्वागत है। मैं शायद ऐसा करने की कोशिश कर रहा दुनिया में एकमात्र व्यक्ति हूं, फिर भी कोई मानक समाधान नहीं लगता है।
'टेक्स्ट <टेक्स्ट' वैध एचटीएमएल है '<' के बाद एक विभाजक चरित्र है और इस प्रकार एन्कोड किए जाने की आवश्यकता नहीं है। लेकिन यह अनुशंसा की जाती है। – Gumbo
ओह, ठीक है। वैसे भी, यह वही बात 'टेक्स्ट <टेक्स्ट' के साथ करता है, और साथ ही' <
lxml.html.clean.Cleaner
वर्ग आपallow_tags
तर्क के साथ एक टैग श्वेत सूची उपलब्ध कराने के लिए औरsafe_attrs_only
तर्क के साथ feedparser से precomputed विशेषता श्वेत सूची उपयोग करने की अनुमति नहीं है। और lxml निश्चित रूप से serialization पर इकाइयों को ठीक से संभालती है।स्रोत
2010-09-10 11:59:17 llasram
जैसा कि मैंने मूल प्रश्न में लिखा था, यह मुझे विशेषताओं की सूची बदलने की अनुमति नहीं देता है। उदाहरण के लिए, 'tabindex' साइट अप्रत्याशित तरीकों से व्यवहार कर सकती है, और कुछ कल्पनाओं के साथ,' चार्जसेट 'जैसे विभिन्न एन्कोडिंग विशेषताओं का उपयोग दुर्भावनापूर्ण उद्देश्यों के लिए भी किया जा सकता है, जबकि वे शायद ही कभी (यदि कभी) उपयोगी होते हैं। मैं केवल उन विशेषताओं को अनुमति दूंगा जो वास्तव में उपयोगी (और उपयोग किए गए) हैं। – Thomas
वे फीडपार्सर द्वारा स्वीकार किए गए गुणों की सूची में हैं, जो कि सुंदर पागल है। यदि आप अधिक पागल हैं, तो आप केवल उन गुणों के लिए 'lxml.html.defs.safe_attrs' सेट कर सकते हैं जिन्हें आप सुरक्षित मानते हैं। वैकल्पिक रूप से यदि शेल्फ को पूरी तरह से बंद नहीं किया जाता है, तो आप शायद 'feedparser._HTMLSanitizer' वर्ग का पुन: उपयोग कर सकते हैं, जो उन गुणों के अनुरूप संशोधित कर सकते हैं जिन्हें आप अनुमति देना चाहते हैं। – llasram
मुझे वह सूची पसंद नहीं है। '