2010-01-27 16 views
13

मैं कैसे सुनिश्चित कर सकता हूं कि मैं दो बार कुछ नहीं बचता?जावा में एचटीएमएल से बचने

मैंने सुना है कि मूल्यों से बचने के लिए यह अच्छा अभ्यास है क्योंकि आप उन्हें एक रूप से प्राप्त करते हैं, और आउटपुट करते समय भी बचते हैं। इस तरह आपके पास कुछ पकड़ने के दो मौके हैं।

+5

जोएल स्पॉल्स्की * मेकिंग कोड लुक गलत * लेख - http://www.joelonsoftware.com/articles/Wrong.html - इस सटीक प्रकार की समस्या के बारे में है। – mob

+0

मुझे वास्तव में वह लेख पसंद आया :) – Kyle

+0

वास्तव में अच्छा पढ़ा। – pastapockets

उत्तर

18

मुझे लगता है कि आप जेएसपी का उपयोग कर रहे हैं।

बस के दौरान प्रदर्शित करें। JSTL<c:out> टैग के लिए बिल्कुल उपयुक्त है। यह डिफ़ॉल्ट रूप से एचटीएमएल इकाइयों से बच निकलता है। प्रत्येक उपयोगकर्ता द्वारा नियंत्रित इनपुट, जैसे अनुरोध URL, अनुरोध शीर्षलेख और अनुरोध पैरामीटर प्रदर्शित करने के लिए इसका उपयोग करें।

उदा।

<input type="text" name="foo" value="<c:out value="${param.foo}" />"> 

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

यदि आप जानना चाहते हैं कि इनपुट के दौरान क्या बचाना है, तो यह SQL injection होगा। ऐसे मामले में नियमित Statement के बजाय PreparedStatement का उपयोग करें, जब भी आप किसी भी डेटाबेस में उपयोगकर्ता द्वारा नियंत्रित इनपुट को सहेजना चाहते हैं।

उदा।

create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))"); 
create.setString(1, username); 
create.setString(2, password); 
create.executeUpdate(); 
+0

अब मैं प्रदर्शन के दौरान बचने के लिए आश्वस्त हूं। मैं सोच रहा हूं कि क्यों वसंत के रूप में वसंत के लिए 'defaultHtmlEscape' है? – Kyle

+0

@ स्पीन्स: फ्रेमवर्क ब्लोट? –

+0

क्या यह डिफ़ॉल्ट रूप से "htmlescape" सेट करने का विकल्प नहीं है ... और htmlescape का अर्थ है कि यह अंतिम HTML फॉर्म में मूल्यों को बच जाएगा? कुछ <इनपुट प्रकार = "टेक्स्टबॉक्स" मान = "कुछ & gt; एक्सट्रेंज & gt; वर्ण" ...> – helios

3

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

2

एक संदर्भ में हानिकारक सामग्री किसी अन्य संदर्भ में खतरनाक हो सकती है। इंजेक्शन हमलों से बचने का सबसे अच्छा तरीका यह है कि इसे किसी अन्य संदर्भ में पास करने से पहले सामग्री तैयार करना है। आपके मामले में एचटीएमएल पाठ ब्राउज़र में पारित होने पर इसके संदर्भ को बदल देता है। सर्वर एचटीएमएल प्रस्तुत नहीं करता है लेकिन ब्राउजर करता है। तो ब्राउज़र पर कोई दुर्भावनापूर्ण HTML पास करना सुनिश्चित करें और भेजने से पहले इसे मुखौटा करें।

ऐसा करने का एक और तर्क यह है कि यह संभव हो सकता है कि हमले कोड दो अयस्क अधिक इनपुट से आवेदन के भीतर इकट्ठा किया गया हो। प्रत्येक इनपुट हानिरहित था लेकिन एक साथ वे खतरनाक हो सकते हैं।

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