2010-05-06 17 views
5

मैं एक वेब ऐप विकसित कर रहा हूं जहां उपयोगकर्ता ब्लॉग प्रविष्टियों का जवाब दे सकते हैं। यह एक सुरक्षा समस्या है क्योंकि वे खतरनाक डेटा भेज सकते हैं जो अन्य उपयोगकर्ताओं को प्रदान की जाएगी (और जावास्क्रिप्ट द्वारा निष्पादित)।एक्सएसएस हमले की रोकथाम

वे भेजे गए पाठ को प्रारूपित नहीं कर सकते हैं। कोई "बोल्ड" नहीं, कोई रंग नहीं, कुछ भी नहीं। बस सरल पाठ। "।" "?"

[^\\w\\s.?!()] 

तो कुछ भी है कि एक शब्द चरित्र (az, AZ, 0-9), नहीं एक खाली स्थान के नहीं है,,, ": मैं अपने समस्या को हल करने के लिए इस regex के साथ आया था ! "," ("या") "को खाली स्ट्रिंग के साथ बदल दिया जाएगा। प्रत्येक quatation चिह्न से प्रतिस्थापित किया जाएगा: "& उद्धरण"।

मैं सामने के अंत में डेटा की जांच करता हूं और मैं इसे अपने सर्वर पर जांचता हूं।

क्या कोई तरीका है कि कोई इस "समाधान" को बाईपास कर सकता है?

मुझे आश्चर्य है कि स्टैक ओवरव्लो इस बात को कैसे करता है? यहां बहुत सारे प्रारूपण हैं इसलिए उन्हें इसके साथ अच्छा काम करना चाहिए।

+0

आपकी सर्वर साइड भाषा क्या है? –

+0

जावा। मैं Servlets – Colby77

+0

का उपयोग करता हूं आपने '<>' के बारे में कुछ भी नहीं कहा, जो शायद xss में उपयोग किए जाने वाले सबसे महत्वपूर्ण वर्ण हैं ... – rook

उत्तर

0

फ्रंट एंड को फॉर्म जानकारी जोड़कर फिडलर का उपयोग करके बाईपास किया जा सकता है। बैक एंड पर एचटीएमएल एन्कोडिंग उदा। < एक > = & लेफ्टिनेंट; & gt;

इस प्रकार टेक्स्ट को HTML तत्वों के रूप में प्रदर्शित नहीं किया जाएगा।

1
  1. एचटीएमएल टैग की अनुमति न दें।
  2. किसी भी उपयोगकर्ता को एचटीएमएल के बिना दर्ज किए गए किसी भी आउटपुट को आउटपुट न करें- इसे पहले से बचाना। यह एक और महत्वपूर्ण बात है! ऐसा करें और आपके पास कभी भी XSS समस्या नहीं होगी।
  3. एक पूर्वावलोकन फ़ंक्शन प्रदान करें ताकि उपयोगकर्ता पोस्ट कर सकें कि यह पोस्ट करने से पहले कैसा दिखाई देगा।

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

अनुमति <p>, <a href="..."> और <img src="..."> कहते हैं:

  1. उपयोगकर्ता स्ट्रिंग है कि हर मैच के लिए <\S[^>]*>
  2. मैचों में सब कुछ मिल जाए, <(p|a href="[^"]+"|img src="[^"]+")/?>|</(a|p)>
  3. के विरूद्ध उसकी जांच करता है, तो यह है कि कठोर regex से मेल नहीं खाती , इसे दूर फेंक दो।
  4. ऊपर बिंदु # 2 देखें।
  5. जानबूझकर अपने सिस्टम को तोड़ने के लिए कड़ी मेहनत करें। दूसरों को अपने सिस्टम को आजमाने और तोड़ने के लिए कहें।
2

मैं टॉमलाक से सहमत हूं, और बस कुछ अंक जोड़ना चाहता था।

  1. एचटीएमएल टैग की अनुमति न दें। विचार है कि उपयोगकर्ता इनपुट को पाठ के रूप में, और एचटीएमएल से बचने वाले पात्रों को उन्हें प्रस्तुत करने से पहले व्यवहार करना है। इस उद्देश्य के लिए OWASP's ESAPI प्रोजेक्ट का उपयोग करें। This page explains the various possible encodings कि आपको अवगत होना चाहिए।
  2. यदि आपको HTML टैग्स को अनुमति देना है, तो आपके लिए फ़िल्टरिंग करने के लिए लाइब्रेरी का उपयोग करें। अपना खुद का रेगेक्स मत लिखो; उन्हें सही होना मुश्किल है। OWASP's Anti-Samy project का उपयोग करें - यह विशेष रूप से इस उपयोग के मामले के लिए डिज़ाइन किया गया था।
3

यदि आप केवल साधारण पाठ चाहते हैं तो विशिष्ट HTML टैग फ़िल्टर करने की चिंता न करें। आप PHP के htmlspecialchars() के समतुल्य चाहते हैं। एक अच्छा तरीका यह उपयोग करने के लिए इस समारोह निम्नलिखित एन्कोडिंग प्रदर्शन करेंगे print htmlspecialchars($var,ENT_QUOTES); है:

'&' (ampersand) becomes '&amp;' 
'"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set. 
''' (single quote) becomes '&#039;' only when ENT_QUOTES is set. 
'<' (less than) becomes '&lt;' 
'>' (greater than) becomes '&gt;' 

यह निम्नतम स्तर पर XSS की समस्या को हल है, और आप कुछ जटिल पुस्तकालय/regex है कि आप डॉन 'की जरूरत नहीं है टी समझ में नहीं आता है (और सभी जटिलता सुरक्षा के दुश्मन के बाद शायद असुरक्षित है)।

free xss scanner चलाकर अपने एक्सएसएस फ़िल्टर का परीक्षण करें।

1

मैं the XSS Prevention Cheat Sheet पढ़ने की अनुशंसा करता हूं जो XSS हमलों से बचने के लिए सबसे अच्छा अभ्यास है। अनिवार्य रूप से, आपको फ़िल्टर करने की आवश्यकता है उस संदर्भ पर निर्भर करता है जिसमें इसका उपयोग किया जाएगा।

उदाहरण के लिए, परिदृश्य के इस प्रकार में: यदि आप एक urlescape क्या करने की जरूरत

& --> &amp; 
< --> &lt; 
> --> &gt; 
" --> &quot; 
' --> &#x27;  &apos; is not recommended 
/--> &#x2F;  forward slash is included as it helps end an HTML entity 

, वहीं एक href="" उदाहरण के मामले में:

<body>...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...</body> 

आप क्या करने की जरूरत

"अल्फान्यूमेरिक वर्णों को छोड़कर,के साथ 256 से कम ASCII मानों वाले सभी वर्णों से बचेंभागने का प्रारूप। डेटा में अविश्वसनीय डेटा सहित: URL को अनुमति नहीं दी जानी चाहिए क्योंकि URL से स्विचिंग को रोकने के लिए भागने से बचने के लिए हमलों को अक्षम करने का कोई अच्छा तरीका नहीं है। सभी विशेषताओं को उद्धृत किया जाना चाहिए। अनगिनत विशेषताओं को [स्पेस]% * +, - /; सहित कई वर्णों से विभाजित किया जा सकता है। < =>^और | ध्यान दें कि इकाई एन्कोडिंग इस संदर्भ में बेकार है। "

उद्धृत लेख पूर्ण फैसले देता है, उम्मीद है कि इस सवाल का जवाब में पर्याप्त जानकारी आप आरंभ करने के लिए है।

0

किसी भी बुरा चरित्र दृश्यों पहले निकालें, जैसे लंबा UTF-8, अवैध यूनिकोड।

कि क्या < और > छीन या संस्थाओं में बदल रहे हैं आप और अधिक स्पष्ट करने की आवश्यकता होगी।

तुम भी पट्टी या डबल सांकेतिक शब्दों में बदलना करने की आवश्यकता होगी और एकल उद्धरण, अन्यथा हमलावर एक आंतरिक घटना जोड़ सकता है जहां आपने अपेक्षा नहीं की थी, उदा। < इनपुट name = 'टिप्पणी' मान = 'foo ' onSomething = पेलोड, एक = '' >

तुम सच में विशेष रूप से यदि आप HTML के कुछ सबसेट अनुमति देने के लिए, regexes के साथ यह पार्स करने का प्रयास सावधान रहना चाहते हैं, तो अपने साथ आओ, उदाहरण के लिए ब्राउज़र मुश्किल टैग <a b=">"onMouseOver=alert(42)> प्रस्तुत करेंगे ठीक है जहां एक रेगेक्स इसे मेल नहीं कर सकता है। पहले उल्लिखित Anti-Samy देखें।

आप हैं, वे href या src विशेषताओं HTML टैग की अनुमति दे रहे हैं, वे http(s): योजनाओं, नहीं javascript: लोगों को इंगित सुनिश्चित करें।

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