2008-08-24 3 views
20

Джефф фактически опубликовал об этом в Sanitize HTML. Но его пример - в C#, и меня больше интересует Java-версия. Кто-нибудь имеет лучшую версию для Java? Его пример достаточно хорош, чтобы просто преобразовать непосредственно из C# в Java?Лучшее регулярное выражение для захвата атаки XSS (Cross-Site Scripting) (на Java)?

[Обновить] Я поставил щедрость на этот вопрос, потому что SO был не так популярен, когда я задал вопрос, как сегодня (*). Что касается всего, что связано с безопасностью, чем больше людей заглядывают в нее, тем лучше!

(*) На самом деле, я думаю, это было еще в закрытой бете

+0

Что еще вам нужно? Ответы мне нравятся. – 2009-02-10 18:08:36

ответ

60

Не делайте этого с помощью регулярных выражений. Помните, что вы не защищаете только от действительного HTML; вы защищаете DOM, создаваемые веб-браузерами. Браузеры могут быть легко обмануты, чтобы создать допустимый DOM из недействительного HTML.

Например, см. Этот список obfuscated XSS attacks. Готовы ли вы адаптировать регулярное выражение для предотвращения этой реальной атаки на Yahoo and Hotmail на IE6/7/8?

<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> 

Как насчет этой атаки, которая работает на IE6?

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

Как насчет атак, которые не указаны на этом сайте? Проблема с подходом Джеффа состоит в том, что это не белый список, как утверждают. Как кто-то на that page отмечает умело:

Проблема с этим, является то, что HTML должны быть чистыми. Есть случаи, когда вы можете передать в hacked html, и это не будет соответствовать ему, и в этом случае он будет вернуть взломанную строку html, так как она ничего не заменит. Это не является строго белым.

Я бы предложил использовать специально предназначенный инструмент, например, AntiSamy. Он работает, фактически анализируя HTML, а затем пересекая DOM и удаляя все, что не находится в настраиваемом белом списке. Основное различие заключается в способности грациозно обрабатывать неверный HTML.

Лучшая часть состоит в том, что на самом деле это блок-тесты для всех атак XSS на вышеуказанном сайте. Кроме того, что может быть проще, чем этот вызов 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

AntiSamy отлично смотрится! Кроме того, использование разных политик - хорошая идея, так как она сохраняет правила очистки вне кода, что упрощает его поддержку. Это, безусловно, очень хороший подход. Престижность. – potyl 2009-02-11 04:05:53

+1

+1. Вы не можете надежно обрабатывать HTML с помощью regex. Разбор его в легко фильтруемый DOM, а затем использование и хорошо известная сериализация, безусловно, более разумный подход. – bobince 2009-02-11 13:34:57

4

Регулярное выражения показано в вашем примере, должны работать независимо от языка.

Так это регулярное выражение, которое вы хотите, или код Java, чтобы поместить эту логику вокруг регулярного выражения?

0

Самая большая проблема при использовании Джеффс кода является @, который в настоящее время доступны разве.

я бы, наверное, просто взять «сырой» регулярное выражение из Джеффс кода, если мне нужно его и вставить его в

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

и видеть вещи, требующие побег получить убежали, а затем использовать его.


Принимая использование этого регулярное выражение в виду, я бы лично убедиться, что я точно понял, что я делаю, почему и какие последствия будут, если я не удастся, перед копированием/вставкой ничего, как и другие ответы попробовать чтобы помочь вам.

(Thats propbably довольно хороший совет для любого копирования/вставки)

4

Я не уверен, что с помощью регулярных выражений является наилучшим способом для нахождения всех подозрительного кода. Регулярные выражения довольно легко обманывают, когда речь идет о сломанном HTML. Например, регулярное выражение, указанное в ссылке Sanitize HTML, не удалит все элементы «a», у которых есть атрибут между именем элемента и атрибутом «href»:

< a alt = "xss injection" href = «http://www.malicous.com/bad.php»>

Более надежный способ удаления вредоносного кода - полагаться на XML-анализатор, который может обрабатывать все типы HTML-документов (Tidy, TagSoup и т. д.), и выбрать элементы для удаления с выражением XPath. После того, как документ HTML анализируется в документе DOM, элементы для revome можно легко и безопасно найти. Это даже легко сделать с XSLT.

+0

+1, см. Мой ответ на реальный Java API, который делает именно это. – 2009-02-11 01:15:46

0

[\s\w\.]*. Если он не соответствует, у вас есть XSS. Может быть. Обратите внимание, что это выражение допускает только буквы, цифры и периоды. Он избегает всех символов, даже полезных, из-за страха перед XSS. Как только вы разрешите &, у вас есть проблемы. И просто заменить все экземпляры & на &amp; недостаточно. Слишком сложно доверять: P. Очевидно, что это запретит много легитимного текста (вы можете просто заменить все несимметричные символы символом! Или что-то еще), но я думаю, что он убьет XSS.

Идея просто проанализировать его как html и создать новый html, вероятно, лучше.

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

Это будет проверять символы, цифры, пробелы, а также <br> тег. Если вы хотите больше риски вы можете добавить несколько тегов, как

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

Я извлек из NoScript лучших Anti-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% XSS, потому что это часть NoScript, аддон, который регулярно обновляется.

0

Ol ol d, но, возможно, это будет полезно для других пользователей.Существует поддерживаемый инструмент уровень безопасности для PHP: https://github.com/PHPIDS/ Он основан на множестве регулярных выражений, которые вы можете найти здесь:

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

Смежные вопросы