2009-10-22 9 views
10

मेरे वेब एप्लिकेशन में मैं उपयोगकर्ता द्वारा जेनरेट की गई सामग्री को सार्वजनिक उपभोग के लिए स्टैक ओवरफ्लो के समान पोस्ट करने की अनुमति देता हूं।उपयोगकर्ता द्वारा जेनरेट की गई HTML सामग्री को संभालने का सबसे अच्छा तरीका क्या है जिसे जनता द्वारा देखा जाएगा?

इसे सौंपने का सबसे अच्छा अभ्यास क्या है?

उपयोगकर्ता सृजित सामग्री से निपटने के लिए मेरे वर्तमान कदम हैं:

  1. मैं MarkItUp उपयोग करने वाले उपयोगकर्ताओं उनके HTML स्वरूप लिए एक आसान तरीका अनुमति देने के लिए।

  2. के बाद यदि कोई उपयोगकर्ता किसी HTML Sanitizerके माध्यम से उनके परिवर्तन मैं इसे चलाने प्रस्तुत किया है एक सफेद सूची दृष्टिकोण का उपयोग करता है ( bottem के लिए स्क्रॉल)।

  3. यदि स्वच्छता प्रक्रिया किसी भी उपयोगकर्ता द्वारा बनाई गई सामग्री को हटा दी गई है Iसामग्री को सहेज न करें। मैं फिर चेतावनी संदेश, के साथ संशोधित सामग्री पर लौटें "कुछ अवैध सामग्री टैग जहां पता चला है और आपके काम को दोबारा जांचने और दोबारा प्रयास करें।"

  4. सामग्री सफ़ाई प्रक्रिया के माध्यम से गुजरता है सफाई से, मैं डेटाबेस के लिए कच्चे html सामग्री को बचाने के।

  5. क्लाइंट को प्रतिपादन करते समय मैं केवल डीबी से कच्चे एचटीएमएल को पृष्ठ पर पास करता हूं।

उत्तर

2

यह एक पूरी तरह से उचित दृष्टिकोण है। ठेठ अनुप्रयोगों के लिए यह पूरी तरह से पर्याप्त होगा।

सफेद-लिस्टिंग कच्चे HTML का सबसे कठिन हिस्सा style विशेषता और embed/object है। वैध कारण हैं कि क्यों कोई सीएसएस शैलियों को स्वरूपित पाठ के अन्यथा अविश्वसनीय ब्लॉक में डालना चाह सकता है, या कह सकता है, एक एम्बेडेड यूट्यूब वीडियो। यह मुद्दा फ़ीड के साथ सबसे अधिक आम तौर पर आता है। आप फीड एंट्री के भीतर निहित पाठ के मनमानी ब्लॉक पर भरोसा नहीं कर सकते हैं, लेकिन आप बाहर निकलना नहीं चाहते हैं, उदाहरण के लिए, सीएसएस या फ्लैश वीडियो को हाइलाइट करना सिंटैक्स, क्योंकि यह मौलिक रूप से सामग्री को बदल देगा और संभावित रूप से इसे पढ़ने वाले किसी को भ्रमित कर देगा। चूंकि सीएसएस में आईई में व्यवहार जैसी खतरनाक चीजें हो सकती हैं, इसलिए आपको style विशेषता में रहने की अनुमति देने का निर्णय लेने पर आपको सीएसएस को पार्स करना पड़ सकता है। और embed/object के साथ आपको श्वेत-सूची होस्टनामों की आवश्यकता हो सकती है।

अनुशेष:

सबसे ज्यादा मामले परिदृश्यों में, दृष्टि में एचटीएमएल भागने सब कुछ एक बहुत ही गरीब उपयोगकर्ता अनुभव हो सकता है। अपने श्वेतसूची के साथ डोम के माध्यम से जाने के लिए एचटीएमएल 5 पार्सर्स में से कुछ का उपयोग करना बेहतर है। यह आपके उपयोगकर्ताओं को स्वच्छता आउटपुट कैसे पेश करता है, इस मामले में यह अधिक लचीला है।तुम भी तरह कर सकते हैं:

:

<div class="sanitized"> 
    <div class="notice"> 
    This was sanitized for security reasons. 
    </div> 
    <div class="raw"><pre> 
    &lt;script&gt;alert("XSS!");&lt;/script&gt; 
    </pre></div> 
</div> 

फिर सीएसएस के साथ .raw सामान छुपाने के लिए, और jQuery का उपयोग .sanitizeddiv कि टॉगल के लिए क्लिक करें हैंडलर बाध्य करने के लिए .raw और .notice के बीच:

सीएसएस

.raw { 
    display: none; 
} 

jQuery:

$('.sanitized').click(function() { 
    $(this).find('.notice').toggle(); 
    $(this).find('.sanitized').toggle(); 
}); 
+0

मैंने अभी तक सीएसएस शैलियों को सामग्री के रूप में उपयोग करने की अनुमति नहीं दी है, लेकिन मैं जल्द ही वीडियो को अनुमति देना चाहता हूं। यह पता चला कि यह खुद पर एक सवाल था। – Aaron

+0

यह है। ज्यादातर मामलों में, मैं फेसबुक मार्ग जाने की सिफारिश करता हूं। अनुलग्नकों जैसे वीडियो का इलाज करें, बल्कि उन्हें सामग्री के हिस्से के रूप में रखें। –

+0

ओह उत्कृष्ट विचार! – Aaron

1

सफेद सूची एक अच्छी चाल है। किसी भी काले सूची समाधान से अधिक से अधिक देने के लिए प्रवण है, क्योंकि आप बस सब कुछ नहीं सोच सकते हैं। मैंने ब्लैक सूचियों (उदाहरण के लिए कोड प्रोजेक्ट) का उपयोग करने के कुछ प्रयास देखे हैं, और यदि वे सबकुछ पकड़ने में कामयाब होते हैं, तो आम तौर पर वे कोड में वर्णों को प्रतिस्थापित करने जैसी अतिरिक्त समस्याएं पैदा करते हैं ताकि इसका उपयोग मैन्युअल रूप से बहाल किए बिना नहीं किया जा सके ।

सबसे सुरक्षित तरीका होगा:

  1. एचटीएमएल सभी पाठ सांकेतिक शब्दों में बदलना।

  2. अनुमत टैग और विशेषताओं का एक सेट मिलान करें और उनको डीकोड करें।

एक रेगुलर एक्सप्रेशन आप भी कर सकते हैं की आवश्यकता होती है प्रत्येक खुलने वाले टैग एक बंद टैग है कि का उपयोग करना, ताकि एक खुली हुई टैग गंदगी पेज नहीं कर सकता।

आपको कोड की दस पंक्तियों की तरह कुछ करने में सक्षम होना चाहिए, इसलिए आपके द्वारा लिंक किया गया कोड अत्यधिक जटिल लगता है।

+0

"एचटीएमएल एन्कोड सभी पाठ" से आपका क्या मतलब है? धन्यवाद! – JDelage

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

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