2008-10-21 11 views
26

प्रदर्शित करते समय संग्रहित करते हैं या सरल संदेश जो मुझे परेशान करता रहता है।एचटीएमएल एन्कोड उपयोगकर्ता इनपुट जब

क्या मुझे HTML इनपुट को तुरंत एन्कोड करना चाहिए और डेटाबेस में एन्कोडेड सामग्री संग्रहीत करना चाहिए, या मुझे प्रदर्शित करते समय कच्चे मान और HTML एन्कोड को स्टोर करना चाहिए?

एन्कोडेड डेटा संग्रहीत करने से डेवलपर का जोखिम बहुत कम हो जाता है जब डेटा प्रदर्शित होने पर डेटा को एन्कोड करना भूल जाता है। हालांकि, एन्कोड किए गए डेटा को संग्रहीत करने से थोड़ा अधिक बोझिल हो जाएगा और यह थोड़ा और अधिक जगह लेगा, भले ही यह आमतौर पर एक गैर-मुद्दा है।

उत्तर

24

मैं दृढ़ता से रास्ते पर एन्कोडिंग जानकारी का सुझाव देता हूं। डेटाबेस में कच्चे डेटा को संग्रहीत करना उपयोगी है यदि आप किसी निश्चित बिंदु पर जिस तरह से इसे देखना चाहते हैं उसे बदलना चाहते हैं। प्रवाह कुछ ऐसा होना चाहिए:

sanitize user input -> protect against sql injection -> db -> encode for display 

ऐसी स्थिति के बारे में सोचें जहां आप जानकारी को आरएसएस फ़ीड के रूप में प्रदर्शित करना चाहते हैं। पुनः प्रदर्शित होने से पहले किसी भी एचटीएमएल विशिष्ट एन्कोडिंग को फिर से प्रदर्शित करना थोड़ा मूर्ख लगता है। किसी भी विकास को हमेशा "इनपुट पर भरोसा न करें" मेम का पालन करना चाहिए, चाहे वह इनपुट किसी उपयोगकर्ता या डेटाबेस से हो।

+2

जब आप कोई चयन कर रहे हों तो बाद के प्रश्न कैसे काम करते हैं .. कहीं और कुछ मानों में HTML एन्कोडिंग है और अन्य नहीं हैं? – DOK

+0

उह, थोड़े गन्दा लगता है। यह वास्तव में आपके विनिर्देशों पर निर्भर करता है, लेकिन अगर मुझे एक परियोजना विरासत में मिली जहां मुझे नए विचार बनाने की आवश्यकता थी, और जानकारी आधा एन्कोड किया गया था, तो शायद मैं लंबे समय तक जीवन को आसान बनाने के लिए अनइंक्ड की गई जानकारी को दोबारा स्टोर कर दूंगा। – Owen

+0

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

5

ध्यान रखें कि आपको किसी ऐसे डेटाबेस के साथ डेटाबेस तक पहुंचने की आवश्यकता हो सकती है जो HTML एन्कोडेड टेक्स्ट (उदा।, एक रिपोर्टिंग टूल) को समझ में नहीं आता है। मैं मानता हूं कि अंतरिक्ष एक गैर-मुद्दा है, लेकिन आईएमएचओ, डेटाबेस में एचटीएमएल एन्कोडिंग डालने से आपके दृश्य/फ्रंट एंड के ज्ञान को एप्लिकेशन में निम्नतम स्तर में ले जाता है, और यह एक डिज़ाइन गलती है।

+0

सहमत हैं! एक्सएसएस को रोकने के लिए पीपीएल करते समय इसे पहली बार अनदेखा किया जाता है। – jack

+0

क्या आप कृपया इस [संबंधित प्रश्न] (http://stackoverflow.com/questions/22297015/should-i-save-in-db-user-input-as-html-encode) पर एक नज़र डालें? –

6

एन्कोडिंग केवल प्रदर्शन में ही किया जाना चाहिए। बिना अपवाद के।

6

आउटपुट।

एचटीएमएल के साथ आप बस एक स्ट्रिंग की लंबाई की जाँच नहीं कर सकते हैं (& 1 चरित्र है, लेकिन strlen() आप 5 बता देंगे) (यह संस्थाओं को तोड़ सकते थे), आप आसानी से इसे काट सकते हैं।

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

PHP ने magic_quotes के साथ समान काम करने की कोशिश की और यह एक बड़ी विफलता साबित हुई। magic_entities मार्ग न लें! :)

0

क्या यह एन्कोडिंग के उद्देश्य को हराने में नहीं है? यदि एक दुर्भावनापूर्ण एसक्यूएल स्क्रिप्ट इनपुट के रूप में दर्ज की जाती है, जिसे बाद में डीबी में पास किया जाता है तो इससे बड़ी समस्या हो सकती है।

+0

यही कारण है कि हम पैरामीटरयुक्त एसक्यूएल का उपयोग करते हैं और हम सुरक्षा सेटिंग्स का लाभ उठाते हैं। एसक्यूएल इंजेक्शन का समाधान सुरक्षा है: उदाहरण के लिए, वेब ऐप उपयोगकर्ताओं को सीधे टेबल पर लिखने के लिए उपयोग न करें और डायनमिक एसक्यूएल: तालिका में डालने के लिए गतिशील स्क्रिप्ट कभी नहीं लिखें। आपके लिए यह करने के लिए प्रो या ओआरएम का प्रयोग करें। –

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