2010-02-25 10 views
6

को रोकने के लिए बच रहा है मैं अपने जावा एप्लिकेशन में कुछ एक्सएसएस रोकथाम में देख रहा हूं।जावा 5 एचटीएमएल

मेरे पास वर्तमान में कस्टम निर्मित दिनचर्या हैं जो मेरे जेएसपीएस में सुरक्षित प्रदर्शन के लिए डेटाबेस में संग्रहीत किसी भी HTML से बच जाएंगी। हालांकि यदि संभव हो तो मैं इसे करने के लिए एक अंतर्निहित/मानक विधि का उपयोग करूंगा।

मैं वर्तमान में डाटाबेस में भेजे गए डेटा को एन्कोड नहीं कर रहा हूं लेकिन यह भी करना शुरू करना चाहता हूं।

क्या कोई ऐसी विधियां हैं जो इसे प्राप्त करने में मेरी सहायता कर सकती हैं?

+5

कृपया सावधान रहें कि नीचे स्वीकृत उत्तर एक अपूर्ण और निष्पक्ष दृष्टिकोण है। 'बड़ा 5 "एन्कोडिंग वास्तव में उस उद्देश्य के लिए कार्य करता है जिस पर इसे डिज़ाइन किया गया था: टैग और विशेषता मानों के अंदर अवैध वर्णों के साथ HTML मार्कअप इंजेक्शन रोकता है। हालांकि यह अधिक विस्तृत इंजेक्शन को नहीं रोकता है, एकल बाइट एन्कोडिंग के साथ लेखकों को स्ट्रिंग्स आउटपुट करते समय "श्रेणी वर्णों = प्रश्न चिह्नों से बाहर" में मदद नहीं करता है, न ही जब चरित्र प्रदर्शित पृष्ठ पर ब्राउज़र एन्कोडिंग स्विच करता है तो चरित्र पुनरावृत्ति को रोकता है http: // www .owasp.org/index.php/How_to_perform_HTML_entity_encoding_in_Java – Pool

+0

क्या आप यह नहीं कहेंगे कि स्वीकृत उत्तर सामान्य रूप से सही है, यह सिर्फ इतना है कि HTML से बचने के लिए वर्णों की एक बड़ी श्रृंखला को जिम्मेदार माना जाना चाहिए? – AJM

+0

दरवाजा बंद रखना अच्छा है, लेकिन शायद खिड़कियों को चौड़ा खोलने के लिए सबसे अच्छा नहीं है। यह खतरनाक सलाह है। – Pool

उत्तर

9

आप आम तौर पर, प्रदर्शन दौरान XSS बच नहीं दुकान दौरान। जेएसपी में आप JSTL का उपयोग कर सकते हैं (/WEB-INF/lib में <c:out> टैग या fn:escapeXml इस के लिए फ़ंक्शन करें। जैसे

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

या

<input name="foo" value="${fn:escapeXml(param.foo)}"> 

यह है कि। यदि आप डीबी में इनपुट और/या भंडारण को संसाधित करते समय भी करते हैं, तो यह सब व्यवसाय कोड और/या डेटाबेस में फैल गया है। आपको ऐसा नहीं करना चाहिए, यह केवल रखरखाव की समस्या है और आप अलग-अलग स्थानों पर ऐसा करते समय डबल-एस्केप या अधिक जोखिम लेते हैं (उदाहरण के लिए &के बजाय &amp;amp; बन जाएगा ताकि अंततः & के बजाय एंडुसर &amp; देखें। ।। कोड और डीबी XSS के लिए संवेदनशील नहीं होते केवल दृश्य है तब आप यह केवल वहीं बच चाहिए

अद्यतन:।

मैं केवल आपको चेतावनी देगा: आप नहीं सर्वलेट/फिल्टर/javacode/डेटाबेस में यह से बचने के लिए/जो कुछ भी आवश्यकता है। आप केवल अनावश्यक रूप से अतिसंवेदनशील चीजें हैं। प्रदर्शन के दौरान बस इसे बचें। बस इतना ही।

+0

हां शायद मुझे अब प्रश्न पोस्ट करना बंद कर देना चाहिए ... निष्कर्ष निकालने के मामले में जो निष्कर्ष निकाला गया है, लेकिन मुझे लगता है कि कुछ साइटें आपको सलाह देते हैं कि आप कम से कम आउटपुट करें और फिर इसे स्टोर पर ऊपर और ऊपर एन्कोड करें उस। – AJM

+0

आपके पास अच्छी साइटें हैं और आपके पास खराब साइटें हैं। – BalusC

+0

यूप, लेकिन क्या आप एक निश्चित निश्चित स्रोत के बारे में जानते हैं कि मैं किसी ऐसे व्यक्ति को इंगित कर सकता हूं जो अपने दिमाग को बदलने के लिए एन्कोडेड HTML को जारी रखने के विचार से प्यार करता है !! – AJM

5

अंतर्निहित नहीं है, लेकिन owasp esapi filter देखें, यह वही करना चाहिए जो आप ढूंढ रहे हैं और अधिक। यह ओवस्प ("ओपन वेब एप्लिकेशन सिक्योरिटी प्रोजेक्ट") में स्मार्ट लड़कों & लड़कियों द्वारा लिखित एक महान ओपन सोर्स सुरक्षा लाइब्रेरी है।

5

मुझे कहना है कि मैं एक्सएसएस को रोकने के लिए आउटपुट पर बचने के स्वीकार्य उत्तर से असहमत हूं।

मेरा मानना ​​है कि बेहतर दृष्टिकोण इनपुट पर sanitize है जो आसानी से एक पहलू के साथ हासिल किया जा सकता है ताकि आपको इसे जगह पर नहीं रखना पड़े। Sanitizing से बचने से अलग है।

आप बस आँख बंद करके नहीं बच सकते हैं:

  • आप उन एचटीएमएल का एक सबसेट (उर्फ लिंक और बोल्ड टैग) में प्रवेश कर सकते हैं।
  • बचने XSS

मैं फिल्टर का एक पहलू या @ futtta की सिफारिश के साथ OWASP Antisammy पुस्तकालय उपयोग करने की अनुशंसा नहीं रोकता है।

नीचे एक पहलू है जिसे मैंने स्प्रिंग एमवीसी एनोटेशन का उपयोग करके उपयोगकर्ता इनपुट को स्वच्छ करने के लिए लिखा है (क्योंकि हम अपने सभी इनपुट के लिए इसका उपयोग करते हैं)।

@SuppressWarnings("unused") 
@Aspect 
public class UserInputSanitizerAdivsor { 

    @Around("execution(@RequestMapping * * (..))") 
    public Object check(final ProceedingJoinPoint jp) throws Throwable { 
     Object[] args = jp.getArgs(); 
     if (args != null) { 
      for (int i = 0; i < args.length; i++) { 
       Object o = args[i]; 
       if (o != null && o instanceof String) { 
        String s = (String) o; 
        args[i] = UserInputSanitizer.sanitize(s); 
       } 
      } 
     } 
     return jp.proceed(args); 
    } 
} 

आप अभी भी गैर अमीर टेक्स्ट फ़ील्ड के लिए उत्पादन पर से बचने के लिए होगा, लेकिन आप कभी नहीं होगा (और मुझे विश्वास है कभी नहीं करना चाहिए) अपने डेटाबेस में दुर्भावनापूर्ण डेटा है।

यदि आप कुछ इनपुट पर sanitize नहीं करना चाहते हैं तो आप हमेशा एनोटेशन कर सकते हैं जो पहलू को स्वच्छ नहीं करेगा।

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

इनपुट को अवरुद्ध करना या इनपुट अवरुद्ध करना ठीक है (मेरा मतलब है कि अधिकांश लोगों के पास फ़ाइल अपलोड सीमा सही है?)। किसी वेब एप्लिकेशन में अधिकांश फ़ील्ड को स्क्रिप्ट टैग दर्ज करने की आवश्यकता नहीं होती है और अधिक महत्वपूर्ण बात यह है कि आपके अधिकांश उपयोगकर्ताओं को शायद स्क्रिप्ट टैग दर्ज करना या आवश्यकता नहीं है (स्पष्ट अपवाद स्टैक ओवरफ़्लो उत्तर है)।

+0

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

+0

वास्तविकता यह है कि आपको विशेष रूप से यदि आप HTML इनपुट की अनुमति देते हैं तो दोनों को करने की आवश्यकता है। सिर्फ इसलिए कि आप sanitize का मतलब यह नहीं है कि आपको इसे भी स्टोर करना होगा। आप बस असफल हो सकते हैं और उपयोगकर्ता को क्यों बता सकते हैं। –