2008-09-12 10 views
6

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

मैं जेएसपी, एएसपीनेट और PHP के उत्तरों की सराहना करता हूं।

उत्तर

5

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

पीएचपी के लिए: htmlentities और htmlspecialchars

+1

असल में, आपको HTML टैग या विशेषता के अंदर मौजूद सभी टेक्स्ट को एन्कोड करना चाहिए - भले ही यह उपयोगकर्ता से आया हो। उदाहरण के लिए: 'Barnes & Noble's Books' –

0

यदि आप वास्तव में प्रत्येक आउटपुट को HTML एन्कोड करते हैं, तो उपयोगकर्ता & लेफ्टिनेंट के सादे पाठ को देखेगा; एचटीएमएल & gt; एक कामकाजी वेब ऐप के बजाय।

संपादित करें: यदि आप एनकोड हर एक इनपुट HTML हैं, तो आप समस्या < आदि युक्त बाहरी पासवर्ड को स्वीकार करना होगा ..

+0

मेरा मतलब आउटपुट स्ट्रिंग ..... – Niyaz

+0

एएसपी.नेट या PHP के दृष्टिकोण से सब कुछ प्रतिक्रिया बफर में केवल एक स्ट्रिंग है। –

+0

आप इसे संसाधित करने से पहले इनपुट को एन्कोड नहीं करते हैं। जब आप इसे उपयोगकर्ता को आउटपुट करते हैं तो इनपुट इनपुट को एन्कोड करते हैं ... इस प्रकार XSS हमले काम करते हैं। –

1

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

मेरे पास अब संशोधक नहीं है; लेकिन एक ही संस्करण के बारे में यहां पाया जा सकता है:

http://www.madcat.nl/martijn/archives/16-Using-smarty-to-prevent-HTML-injection..html

नई Django 1.0 रिलीज उसी तरह इस वास्तव में काम करता है में, जय :)

1

आप लपेट सकता है अपनी खुद की में गूंज/प्रिंट आदि विधियों जिन्हें आप आउटपुट से बचने के लिए उपयोग कर सकते हैं। अर्थात के बजाय

echo "blah"; 

उपयोग

myecho('blah'); 

तुम भी एक दूसरे परम कि बंद हो जाती है अगर आप इसे जरूरत से बचने हो सकता था।

एक प्रोजेक्ट में हमारे आउटपुट फ़ंक्शंस में डीबग मोड था जिसने हमारे आउटपुट टेक्स्ट को अदृश्य तरीके से जाकर बनाया। तब हम जानते थे कि स्क्रीन पर छोड़ी गई कुछ भी बच नहीं गई है! उन शरारती अनजान बिट्स को ट्रैक करने में बहुत उपयोगी था :)

0

मेरी व्यक्तिगत वरीयता कुछ भी को डेटाबेस, व्यापार परत या उपयोगकर्ता से आ रही है।

एएसपी.Net में यह Server.HtmlEncode(string) का उपयोग करके किया जाता है।

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

0

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

PHP वेब विकास की बात करते समय मेरी पसंद की भाषा है, इसलिए मेरे उत्तर में पूर्वाग्रह के लिए माफ करना।

कियरन।

8

एक बात यह है कि आप नहीं करना चाहिए इनपुट डेटा को फ़िल्टर करने के रूप में फ़िल्टर करें। लोग अक्सर यह सुझाव देते हैं, क्योंकि यह सबसे आसान समाधान है, लेकिन इससे समस्याएं होती हैं।

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

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

यह अधिक काम है, लेकिन आप इसे टेम्पलेट इंजन या पुस्तकालयों का उपयोग करके कम कर सकते हैं।

+0

केवल एचटीएमएल टैग sanitizing के लिए, आपने एसक्यूएल इंजेक्शन को खाते में नहीं लिया। – LotusH

+0

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

0

सॉफ़्टवेयर पर जोएल से एक अच्छा निबंध था (गलत कोड मुझे गलत लगता है, मैं अपने फोन पर हूं अन्यथा मेरे पास एक यूआरएल होगा) जिसमें हंगेरियन नोटेशन के सही उपयोग को शामिल किया गया था। लघु संस्करण होगा कुछ की तरह:

Var dsFirstName, uhsFirstName : String; 

Begin 

uhsFirstName := request.queryfields.value['firstname']; 

dsFirstName := dsHtmlToDB(uhsFirstName); 

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

+0

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

3

जेएसपी के लिए, आप अपने केक ले सकते हैं और इसे भी खा सकते हैं, सी: आउट टैग, जो डिफ़ॉल्ट रूप से एक्सएमएल से बच निकलता है। इसका मतलब है आप कच्चे तत्वों के रूप में अपने गुण के लिए बाध्य कर सकते हैं:

<input name="someName.someProperty" value="<c:out value='${someName.someProperty}' />" /> 

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

+0

दुर्भाग्य से 'c: out' HTML विशेषताओं के लिए पर्याप्त नहीं है :-( –

0

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

0

OWASP में HTML आउटपुट को एन्कोड करने के लिए एक अच्छा एपीआई है, या तो HTML टेक्स्ट (उदा। पैराग्राफ या <textarea> सामग्री) या एक विशेषता के मान के रूप में उपयोग करने के लिए (उदा।

encodeForHTML($input) // Encode data for use in HTML using HTML entity encoding 
encodeForHTMLAttribute($input) // Encode data for use in HTML attributes. 

परियोजना (PHP संस्करण) http://code.google.com/p/owasp-esapi-php/ के तहत होस्ट और भी कुछ अन्य भाषाओं के लिए उपलब्ध है, उदाहरण के लिए: एक रूप अस्वीकृत करने के बाद <input> टैग) के लिए नेट।

याद रखें कि आप सब कुछ (न केवल उपयोगकर्ता इनपुट), और के रूप में देर से संभव (जब डीबी में भंडारण नहीं, लेकिन जब HTTP प्रतिसाद outputting) के रूप में सांकेतिक शब्दों में बदलना चाहिए।

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