2010-09-10 14 views
11

मैं ग्राहक से कुछ 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 के रूप में अच्छी तरह से है।

स्पष्ट समाधान सभी < वर्णों को &lt; से प्रतिस्थापित करना है, जो पार्सिंग के बाद, टैग से संबंधित नहीं हैं (और >&'" के समान)। लेकिन Beautiful Soup documentation केवल इकाइयों की पार्सिंग का उल्लेख करता है, न कि उनके उत्पादन। बेशक मैं सभी NavigableString नोड्स पर एक प्रतिस्थापन चला सकता हूं, लेकिन चूंकि मुझे कुछ याद आ सकता है, इसलिए मैं कुछ कोशिश करने और परीक्षण कोड को काम करने देता हूं।

सुंदर सूप डिफ़ॉल्ट रूप से < (और अन्य जादू वर्ण) से क्यों नहीं बचते हैं, और मैं इसे कैसे कर सकता हूं?


एनबी। मैंने lxml.html.clean पर भी देखा है। ऐसा लगता है कि ब्लैकलिस्टिंग के आधार पर काम करना प्रतीत होता है, श्वेतसूची नहीं, इसलिए यह मेरे लिए बहुत सुरक्षित नहीं लगता है। टैग श्वेतसूचीबद्ध किया जा सकता है, लेकिन गुण नहीं कर सकते हैं, और यह मेरे स्वाद के लिए बहुत अधिक विशेषताओं की अनुमति देता है (उदा। tabindex)। इसके अलावा, यह इनपुट पर AssertionError देता है। अच्छा नही।

एचटीएमएल को साफ करने के अन्य तरीकों के सुझाव भी बहुत स्वागत है। मैं शायद ऐसा करने की कोशिश कर रहा दुनिया में एकमात्र व्यक्ति हूं, फिर भी कोई मानक समाधान नहीं लगता है।

+0

'टेक्स्ट <टेक्स्ट' वैध एचटीएमएल है '<' के बाद एक विभाजक चरित्र है और इस प्रकार एन्कोड किए जाने की आवश्यकता नहीं है। लेकिन यह अनुशंसा की जाती है। – Gumbo

+0

ओह, ठीक है। वैसे भी, यह वही बात 'टेक्स्ट <टेक्स्ट' के साथ करता है, और साथ ही' <

2

lxml.html.clean.Cleaner वर्ग आप allow_tags तर्क के साथ एक टैग श्वेत सूची उपलब्ध कराने के लिए और safe_attrs_only तर्क के साथ feedparser से precomputed विशेषता श्वेत सूची उपयोग करने की अनुमति नहीं है। और lxml निश्चित रूप से serialization पर इकाइयों को ठीक से संभालती है।

+0

जैसा कि मैंने मूल प्रश्न में लिखा था, यह मुझे विशेषताओं की सूची बदलने की अनुमति नहीं देता है। उदाहरण के लिए, 'tabindex' साइट अप्रत्याशित तरीकों से व्यवहार कर सकती है, और कुछ कल्पनाओं के साथ,' चार्जसेट 'जैसे विभिन्न एन्कोडिंग विशेषताओं का उपयोग दुर्भावनापूर्ण उद्देश्यों के लिए भी किया जा सकता है, जबकि वे शायद ही कभी (यदि कभी) उपयोगी होते हैं। मैं केवल उन विशेषताओं को अनुमति दूंगा जो वास्तव में उपयोगी (और उपयोग किए गए) हैं। – Thomas

+0

वे फीडपार्सर द्वारा स्वीकार किए गए गुणों की सूची में हैं, जो कि सुंदर पागल है। यदि आप अधिक पागल हैं, तो आप केवल उन गुणों के लिए 'lxml.html.defs.safe_attrs' सेट कर सकते हैं जिन्हें आप सुरक्षित मानते हैं। वैकल्पिक रूप से यदि शेल्फ को पूरी तरह से बंद नहीं किया जाता है, तो आप शायद 'feedparser._HTMLSanitizer' वर्ग का पुन: उपयोग कर सकते हैं, जो उन गुणों के अनुरूप संशोधित कर सकते हैं जिन्हें आप अनुमति देना चाहते हैं। – llasram

+2

मुझे वह सूची पसंद नहीं है। '

' तत्व इस पर है।ओह, और मैंने सिर्फ 'lxml/html/defs.py' में एक टाइपो देखा: 'मार्की' के बजाय' मार्की', अभी भी svn संस्करण में मौजूद है। मैंने एक बग की सूचना दी है। कोई बड़ा सौदा नहीं है, लेकिन यह आत्मविश्वास बढ़ाने में मदद नहीं करता है ... – Thomas

संबंधित मुद्दे