मुझे कहना है कि मैं एक्सएसएस को रोकने के लिए आउटपुट पर बचने के स्वीकार्य उत्तर से असहमत हूं।
मेरा मानना है कि बेहतर दृष्टिकोण इनपुट पर 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 नहीं करना चाहते हैं तो आप हमेशा एनोटेशन कर सकते हैं जो पहलू को स्वच्छ नहीं करेगा।
अन्य कारणों से आप अपने डेटाबेस में दुर्भावनापूर्ण डेटा नहीं चाहते हैं, यदि आप इंटरनेट पर किसी भी तरह का आरईएसटी एपीआई प्रदान करते हैं। आप आउटपुट पर सही काम कर सकते हैं लेकिन आपके मैशप पार्टनर नहीं हो सकते हैं।
इनपुट को अवरुद्ध करना या इनपुट अवरुद्ध करना ठीक है (मेरा मतलब है कि अधिकांश लोगों के पास फ़ाइल अपलोड सीमा सही है?)। किसी वेब एप्लिकेशन में अधिकांश फ़ील्ड को स्क्रिप्ट टैग दर्ज करने की आवश्यकता नहीं होती है और अधिक महत्वपूर्ण बात यह है कि आपके अधिकांश उपयोगकर्ताओं को शायद स्क्रिप्ट टैग दर्ज करना या आवश्यकता नहीं है (स्पष्ट अपवाद स्टैक ओवरफ़्लो उत्तर है)।
स्रोत
2011-02-11 12:49:47
कृपया सावधान रहें कि नीचे स्वीकृत उत्तर एक अपूर्ण और निष्पक्ष दृष्टिकोण है। 'बड़ा 5 "एन्कोडिंग वास्तव में उस उद्देश्य के लिए कार्य करता है जिस पर इसे डिज़ाइन किया गया था: टैग और विशेषता मानों के अंदर अवैध वर्णों के साथ HTML मार्कअप इंजेक्शन रोकता है। हालांकि यह अधिक विस्तृत इंजेक्शन को नहीं रोकता है, एकल बाइट एन्कोडिंग के साथ लेखकों को स्ट्रिंग्स आउटपुट करते समय "श्रेणी वर्णों = प्रश्न चिह्नों से बाहर" में मदद नहीं करता है, न ही जब चरित्र प्रदर्शित पृष्ठ पर ब्राउज़र एन्कोडिंग स्विच करता है तो चरित्र पुनरावृत्ति को रोकता है http: // www .owasp.org/index.php/How_to_perform_HTML_entity_encoding_in_Java – Pool
क्या आप यह नहीं कहेंगे कि स्वीकृत उत्तर सामान्य रूप से सही है, यह सिर्फ इतना है कि HTML से बचने के लिए वर्णों की एक बड़ी श्रृंखला को जिम्मेदार माना जाना चाहिए? – AJM
दरवाजा बंद रखना अच्छा है, लेकिन शायद खिड़कियों को चौड़ा खोलने के लिए सबसे अच्छा नहीं है। यह खतरनाक सलाह है। – Pool