2010-04-11 7 views
14

क्या एचटीएमएल को डेटाबेस में संग्रहीत करने से पहले एन्कोड किया जाना चाहिए, डेटाबेस? या ब्राउज़र पर बाहर निकलने के लिए यह सामान्य अभ्यास है?क्या एचटीएमएल को जारी रखने से पहले एन्कोड किया जाना चाहिए?

क्या मेरे सभी टेक्स्ट आधारित फ़ील्ड की लंबाई डेटाबेस में अतिरिक्त संग्रहण की अनुमति देने के लिए चौगुनी होनी चाहिए?

एक ठोस हाँ बजाय सबसे अच्छा अभ्यास या कोई :-)

+1

सर्वोत्तम अभ्यास आमतौर पर समुदाय विकी होते हैं। :) – bzlm

उत्तर

15

क्या आपके डेटाबेस में डेटा वास्तव में एचटीएमएल है या क्या यह एक ऐसा नाम या टिप्पणी है जो आपको पता है कि एक HTML पृष्ठ के हिस्से के रूप में समाप्त हो जाएगा?

यह आवेदन डेटा है, तो मुझे लगता है कि अपने सबसे अच्छे रूप को:

  • एक रूप में यह स्वीकार करते हैं कि पर्यावरण के मूल निवासी (जैसे unencoded डेटाबेस में), और
  • सुनिश्चित करें कि अपनी ठीक से अनुवादित क्योंकि यह प्रतिनिधित्व सीमाओं को पार करता है (जब आप HTML पृष्ठ उत्पन्न करते हैं तो एन्कोड करें)।

यदि आप एमवीसी के प्रशंसक हैं, तो यह मॉडल/(लगातार स्टोरेज प्रारूप से) दृश्य/नियंत्रक को अलग करने में भी मदद करता है।

प्रतिनिधित्व

उदाहरण के लिए, मान कोई टिप्पणी "मैं एम & सुश्री प्यार करता हूँ" छोड़ देता है। कोड में इसे सादे-पाठ स्ट्रिंग "I love M&Ms" के रूप में प्रस्तुत करने के लिए शायद सबसे आसान है, HTML-एन्कोडेड स्ट्रिंग "I love M&Ms" के रूप में नहीं। तकनीकी रूप से, कोड में मौजूद डेटा अभी तक HTML नहीं है और यदि डेटा को यथासंभव सटीक रूप से प्रदर्शित किया जाता है तो जीवन सबसे आसान होता है। इस डेटा को बाद में एक अलग दृश्य में उपयोग किया जा सकता है, उदा। डेस्कटॉप ऐप यह डेटा किसी डेटाबेस, एक फ्लैट फ़ाइल या किसी XML फ़ाइल में संग्रहीत किया जा सकता है, शायद बाद में किसी अन्य प्रोग्राम के साथ साझा किया जा सकता है। स्ट्रिंग को मानने के लिए अन्य कार्यक्रम के लिए यह सबसे सरल है प्रारूप के लिए "देशी" प्रतिनिधित्व में: "I love M&Ms" डेटाबेस और फ्लैट फ़ाइल में और "I love M&Ms" XML फ़ाइल में। मैं एक XML फ़ाइल ("I love &Ms") में एन्कोड किए गए HTML-एन्कोडेड मान को देखने के लिए क्रिंग करता हूं।

अनुवाद

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

प्रतिनिधित्व सीमाओं को पार करते समय ठीक से अनुवाद करने में विफलता इंजेक्शन हमलों जैसे एसक्यूएल-इंजेक्शन हमलों का स्रोत है। जब भी आप कई प्रतिनिधित्व/भाषाओं (जैसे जावा, एसक्यूएल, एचटीएमएल, जावास्क्रिप्ट, एक्सएमएल, आदि) के साथ काम कर रहे हैं, तब से ईमानदार रहें।

-

दूसरी ओर, यदि आप वास्तव में डेटाबेस के लिए HTML पृष्ठ के टुकड़े को बचाने के लिए कोशिश कर रहे हैं, तो मैं तुम्हें द्वारा क्या मतलब द्वारा स्पष्ट नहीं कर रहा हूँ "संग्रहीत किया जा रहा से पहले इनकोडिंग"। यदि यह सख्ती से मान्य HTML है, तो सभी आवश्यक मान पहले ही एन्कोड किए जाने चाहिए (उदा। &, <, आदि)।

0

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

+1

यह हमेशा अच्छा नहीं हो सकता है, क्योंकि मैंने यहां संरेखण डेटा खोला है! –

+0

@ माहेश क्या होगा यदि मूल डेटा एक्सएसएस हमला है? – mxmissile

+3

डेटाबेस में दुर्भावनापूर्ण HTML डालने से सुरक्षा जोखिम नहीं है। ब्राउज़र में उस दुर्भावनापूर्ण HTML को केवल प्रस्तुत करना एक है। इसलिए डेटाबेस में HTML डालने पर HTML संदर्भों को वर्ण संदर्भों के साथ प्रतिस्थापित करना आवश्यक नहीं है। एसक्यूएल के केवल प्रासंगिक विशेष पात्रों को प्रतिस्थापित/भागने की आवश्यकता है। – Gumbo

13

अभ्यास प्रदर्शन से पहले HTML एन्कोड करना है।

यदि आप प्रदर्शित करने से पहले एन्कोडिंग के बारे में संगत हैं, तो आपने XSS रोकथाम का अच्छा सा किया है।

आपको अपने डेटाबेस में मूल फॉर्म सहेजना चाहिए। यह मूल संरक्षित है और आप पर पर अन्य प्रसंस्करण करना चाहते हैं और एन्कोडेड संस्करण पर नहीं।

+0

हमम, मैं प्रत्येक अनुरोध के लिए एन्कोडिंग से बचने की कोशिश कर रहा था क्योंकि यह एक दोहराव वाला कार्य है। हालांकि दिलचस्प लेना :) –

+0

कुछ ढांचे स्वचालित रूप से एन्कोडिंग करेंगे। – Oded

+0

+1 प्रदर्शित करते समय एन्कोड करना अच्छा होता है और भंडारण करते समय नहीं, क्योंकि आपके पास मूल डेटा होगा, अगर आपको इसे अलग-अलग संसाधित करने की आवश्यकता है। –

2

डाटाबेस विक्रेता इनपुट पर बच निकलने वाला आउटपुट, आउटपुट पर बचने वाला एचटीएमएल।

1

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

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

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