2008-08-24 11 views
20

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

[अपडेट] मैंने इस प्रश्न पर एक बक्षीस डाला है क्योंकि जब मैं प्रश्न पूछता हूं तो SO लोकप्रिय नहीं था क्योंकि यह आज (*) है। सुरक्षा से संबंधित कुछ भी के लिए, अधिक लोग इसे देखते हैं, बेहतर यह है!

(*) वास्तव में, मुझे लगता है कि यह अभी भी बंद बीटा में था

+0

आप और अधिक क्या आवश्यकता है? जवाब मेरे लिए अच्छा लग रहा है। –

उत्तर

60

नियमित अभिव्यक्तियों के साथ ऐसा न करें। याद रखें, आप केवल वैध HTML के खिलाफ सुरक्षा नहीं कर रहे हैं; आप वेब ब्राउज़र बनाने वाले डीओएम के खिलाफ सुरक्षा कर रहे हैं। अवैध एचटीएमएल से वैध डीओएम को आसानी से उत्पादित करने में ब्राउज़रों को धोखा दिया जा सकता है।

उदाहरण के लिए, obfuscated XSS attacks की यह सूची देखें। क्या आप आईई 6/7/8 पर Yahoo and Hotmail पर इस असली दुनिया के हमले को रोकने के लिए रेगेक्स तैयार करने के लिए तैयार हैं?

<HTML><BODY> 
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time"> 
<?import namespace="t" implementation="#default#time2"> 
<t:set attributeName="innerHTML" to="XSS&lt;SCRIPT DEFER&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;"> 
</BODY></HTML> 

आईई 6 पर काम करने वाले इस हमले के बारे में कैसे?

<TABLE BACKGROUND="javascript:alert('XSS')"> 

इस साइट पर सूचीबद्ध हमलों के बारे में कैसे? जेफ के दृष्टिकोण के साथ समस्या यह है कि दावा किया गया है कि यह एक श्वेतसूची नहीं है। that page पर किसी adeptly नोटों के रूप में:

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

मैं AntiSamy जैसे उद्देश्य उद्देश्य टूल का सुझाव दूंगा। यह वास्तव में एचटीएमएल को पार्स करके काम करता है, और फिर डीओएम को घुमाता है और कॉन्फ़िगर करने योग्य श्वेतसूची में नहीं है जो कुछ भी हटा रहा है। मुख्य अंतर विकृत रूप से विकृत HTML को संभालने की क्षमता है।

सबसे अच्छा हिस्सा यह है कि यह वास्तव में उपरोक्त साइट पर सभी एक्सएसएस हमलों के लिए यूनिट परीक्षण करता है। इसके अलावा, क्या इस API कॉल की तुलना में आसान हो सकता है:

public String toSafeHtml(String html) throws ScanException, PolicyException { 

    Policy policy = Policy.getInstance(POLICY_FILE); 
    AntiSamy antiSamy = new AntiSamy(); 
    CleanResults cleanResults = antiSamy.scan(html, policy); 
    return cleanResults.getCleanHTML().trim(); 
} 
+0

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

+1

+1। आप regex का उपयोग कर एचटीएमएल विश्वसनीय रूप से संसाधित नहीं कर सकते हैं। इसे आसानी से फ़िल्टर करने योग्य डोम में पार्स करना, फिर उपयोग करना और ज्ञात-अच्छा क्रमबद्धता, अब तक अधिक समझदार दृष्टिकोण है। – bobince

+0

मुझे वास्तव में यह जवाब पसंद है, क्योंकि यह सीधे प्रश्न का उत्तर नहीं देता है, लेकिन इसके बजाय समस्या का समाधान करता है! –

4

regex अपने उदाहरण में दिखाया गया, भाषा की परवाह किए बिना काम करना चाहिए।

तो क्या यह रेगेक्स आप चाहते हैं, या जावा कोड इस तर्क को रेगेक्स के चारों ओर रखने के लिए है?

0

Jeffs कोड का उपयोग करके सबसे बड़ी समस्या @ जो वर्तमान में उपलब्ध नहीं है है।

मैं शायद सिर्फ अगर मैं यह आवश्यक Jeffs कोड से "कच्चे" regexp ले जाएगा और यह

http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html

में पेस्ट करें और जरूरत के भागने से बच गया हो चीजों को देखने और फिर इसे का उपयोग करें।


इसे ध्यान में regex के उपयोग ले रहा है मैं व्यक्तिगत रूप से यकीन है कि मैं समझ गया मैं वास्तव में क्या कर रहा था, क्यों और क्या परिणाम अगर मैं सफल होने के फ्लॉप हो सकता है, प्रति से पहले/कुछ भी चिपका कर, जैसे अन्य जवाब कोशिश बनाना होगा आपकी मदद करने के लिए।

(Thats किसी भी कॉपी/पेस्ट के लिए propbably सुंदर ध्वनि सलाह)

4

मुझे विश्वास करने के लिए नहीं कर रहा हूँ कि एक नियमित अभिव्यक्ति का उपयोग कर सभी संदिग्ध कोड को खोजने के लिए सबसे अच्छा तरीका है। टूटी हुई एचटीएमएल से निपटने पर नियमित अभिव्यक्तियों को विशेष रूप से चाल करना काफी आसान होता है। उदाहरण के लिए, Sanitize HTML लिंक में सूचीबद्ध नियमित अभिव्यक्ति उन सभी 'ए' तत्वों को हटाने में विफल रहेगी जिनमें तत्व नाम और विशेषता 'href' के बीच एक विशेषता है:

< एक alt = "xss इंजेक्शन" href = "http://www.malicous.com/bad.php">

दुर्भावनापूर्ण कोड को हटाने का एक और मजबूत तरीका एक एक्सएमएल पार्सर पर भरोसा करना है जो सभी प्रकार के एचटीएमएल दस्तावेज़ों (टिडी, टैग सूप, आदि) को नियंत्रित कर सकता है। और XPath अभिव्यक्ति के साथ निकालने के लिए तत्वों का चयन करने के लिए। एक बार जब एचटीएमएल दस्तावेज़ को डीओएम दस्तावेज में पार्स किया जाता है तो पुनरुत्थान के तत्व आसानी से और सुरक्षित रूप से पाए जा सकते हैं। एक्सएसएलटी के साथ यह करना भी आसान है।

+0

+1, वास्तविक दुनिया जावा एपीआई के लिए मेरी प्रतिक्रिया देखें जो वास्तव में –

0

[\s\w\.]*। यदि यह मेल नहीं खाता है, तो आपको एक्सएसएस मिल गया है। शायद। ध्यान दें कि यह अभिव्यक्ति केवल अक्षरों, संख्याओं और अवधि की अनुमति देती है। यह एक्सएसएस के डर से सभी प्रतीकों, यहां तक ​​कि उपयोगी लोगों से बचाता है। एक बार जब आप & की अनुमति देते हैं, तो आपको चिंताएं मिलती हैं। और केवल & के सभी उदाहरणों को &amp; के साथ बदलना पर्याप्त नहीं है। विश्वास करने के लिए बहुत जटिल: पी। जाहिर है, यह बहुत सारे वैध पाठ को अस्वीकार कर देगा (आप बस सभी गैर-मिलान करने वाले पात्रों को एक या कुछ के साथ प्रतिस्थापित कर सकते हैं), लेकिन मुझे लगता है कि यह एक्सएसएस को मार देगा।

इसे HTML के रूप में पार्स करने और नया HTML उत्पन्न करने का विचार शायद बेहतर है।

1
^(\s|\w|\d|<br>)*?$ 

यह वर्ण, अंक, सफेद स्थान और <br> टैग को मान्य करेगा। आप अधिक जोखिम आप की तरह

^(\s|\w|\d|<br>|<ul>|<\ul>)*?$ 
2

मैं NoScript सबसे अच्छा विरोधी XSS ऐड-ऑन से निकाला अधिक टैग जोड़ सकते हैं चाहते हैं, यहाँ अपने Regex है: कार्य निर्दोष:

<[^\w<>]*(?:[^<>"'\s]*:)?[^\w<>]*(?:\W*s\W*c\W*r\W*i\W*p\W*t|\W*f\W*o\W*r\W*m|\W*s\W*t\W*y\W*l\W*e|\W*s\W*v\W*g|\W*m\W*a\W*r\W*q\W*u\W*e\W*e|(?:\W*l\W*i\W*n\W*k|\W*o\W*b\W*j\W*e\W*c\W*t|\W*e\W*m\W*b\W*e\W*d|\W*a\W*p\W*p\W*l\W*e\W*t|\W*p\W*a\W*r\W*a\W*m|\W*i?\W*f\W*r\W*a\W*m\W*e|\W*b\W*a\W*s\W*e|\W*b\W*o\W*d\W*y|\W*m\W*e\W*t\W*a|\W*i\W*m\W*a?\W*g\W*e?|\W*v\W*i\W*d\W*e\W*o|\W*a\W*u\W*d\W*i\W*o|\W*b\W*i\W*n\W*d\W*i\W*n\W*g\W*s|\W*s\W*e\W*t|\W*i\W*s\W*i\W*n\W*d\W*e\W*x|\W*a\W*n\W*i\W*m\W*a\W*t\W*e)[^>\w])|(?:<\w[\s\S]*[\s\0\/]|['"])(?:formaction|style|background|src|lowsrc|ping|on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)?|op)|i(?:s(?:c(?:hargingtimechange|onnect(?:ing|ed))|abled)|aling)|ata(?:setc(?:omplete|hanged)|(?:availabl|chang)e|error)|urationchange|ownloading|blclick)|Moz(?:M(?:agnifyGesture(?:Update|Start)?|ouse(?:PixelScroll|Hittest))|S(?:wipeGesture(?:Update|Start|End)?|crolledAreaChanged)|(?:(?:Press)?TapGestur|BeforeResiz)e|EdgeUI(?:C(?:omplet|ancel)|Start)ed|RotateGesture(?:Update|Start)?|A(?:udioAvailable|fterPaint))|c(?:o(?:m(?:p(?:osition(?:update|start|end)|lete)|mand(?:update)?)|n(?:t(?:rolselect|extmenu)|nect(?:ing|ed))|py)|a(?:(?:llschang|ch)ed|nplay(?:through)?|rdstatechange)|h(?:(?:arging(?:time)?ch)?ange|ecking)|(?:fstate|ell)change|u(?:echange|t)|l(?:ick|ose))|m(?:o(?:z(?:pointerlock(?:change|error)|(?:orientation|time)change|fullscreen(?:change|error)|network(?:down|up)load)|use(?:(?:lea|mo)ve|o(?:ver|ut)|enter|wheel|down|up)|ve(?:start|end)?)|essage|ark)|s(?:t(?:a(?:t(?:uschanged|echange)|lled|rt)|k(?:sessione|comma)nd|op)|e(?:ek(?:complete|ing|ed)|(?:lec(?:tstar)?)?t|n(?:ding|t))|u(?:ccess|spend|bmit)|peech(?:start|end)|ound(?:start|end)|croll|how)|b(?:e(?:for(?:e(?:(?:scriptexecu|activa)te|u(?:nload|pdate)|p(?:aste|rint)|c(?:opy|ut)|editfocus)|deactivate)|gin(?:Event)?)|oun(?:dary|ce)|l(?:ocked|ur)|roadcast|usy)|a(?:n(?:imation(?:iteration|start|end)|tennastatechange)|fter(?:(?:scriptexecu|upda)te|print)|udio(?:process|start|end)|d(?:apteradded|dtrack)|ctivate|lerting|bort)|DOM(?:Node(?:Inserted(?:IntoDocument)?|Removed(?:FromDocument)?)|(?:CharacterData|Subtree)Modified|A(?:ttrModified|ctivate)|Focus(?:Out|In)|MouseScroll)|r(?:e(?:s(?:u(?:m(?:ing|e)|lt)|ize|et)|adystatechange|pea(?:tEven)?t|movetrack|trieving|ceived)|ow(?:s(?:inserted|delete)|e(?:nter|xit))|atechange)|p(?:op(?:up(?:hid(?:den|ing)|show(?:ing|n))|state)|a(?:ge(?:hide|show)|(?:st|us)e|int)|ro(?:pertychange|gress)|lay(?:ing)?)|t(?:ouch(?:(?:lea|mo)ve|en(?:ter|d)|cancel|start)|ime(?:update|out)|ransitionend|ext)|u(?:s(?:erproximity|sdreceived)|p(?:gradeneeded|dateready)|n(?:derflow|load))|f(?:o(?:rm(?:change|input)|cus(?:out|in)?)|i(?:lterchange|nish)|ailed)|l(?:o(?:ad(?:e(?:d(?:meta)?data|nd)|start)?|secapture)|evelchange|y)|g(?:amepad(?:(?:dis)?connected|button(?:down|up)|axismove)|et)|e(?:n(?:d(?:Event|ed)?|abled|ter)|rror(?:update)?|mptied|xit)|i(?:cc(?:cardlockerror|infochange)|n(?:coming|valid|put))|o(?:(?:(?:ff|n)lin|bsolet)e|verflow(?:changed)?|pen)|SVG(?:(?:Unl|L)oad|Resize|Scroll|Abort|Error|Zoom)|h(?:e(?:adphoneschange|l[dp])|ashchange|olding)|v(?:o(?:lum|ic)e|ersion)change|w(?:a(?:it|rn)ing|heel)|key(?:press|down|up)|(?:AppComman|Loa)d|no(?:update|match)|Request|zoom))[\s\0]*= 

टेस्ट: http://regex101.com/r/rV7zK8

मुझे लगता है कि यह 99% एक्सएसएस को अवरुद्ध करता है क्योंकि यह नोस्क्रिप्ट का एक हिस्सा है, एक एडन जो नियमित रूप से अपडेट किया जाता है

+0

जावा में संकलित नहीं होता है: इसके कारण: java.util.regex.PatternSyntaxException: इंडेक्स 525 – KIC

+1

के पास अवैध ऑक्टल एस्केप अनुक्रम मैंने उस regex101 परीक्षण स्ट्रिंग में XSS का एक बेहद सरल बिट आज़माया और इसे मेरी पहली कोशिश पर तोड़ दिया। बहुत निर्दोष नहीं है। मैंने जो कुछ किया वह 'जावास्क्रिप्ट:' href के साथ एक लिंक जोड़ रहा था। –

0

एक पुराना धागा लेकिन शायद यह अन्य उपयोगकर्ताओं के लिए उपयोगी होगा।वहाँ php के लिए एक बनाए रखा सुरक्षा परत उपकरण है: https://github.com/PHPIDS/ यह जो आप यहां पा सकते हैं regex का एक सेट पर आधारित है:

https://github.com/PHPIDS/PHPIDS/blob/master/lib/IDS/default_filter.xml