Подтвердить что ты не робот

Лучшее регулярное выражение для захвата атаки XSS (Cross-Site Scripting) (на Java)?

Джефф действительно написал об этом в Sanitize HTML. Но его пример на С#, и я на самом деле больше интересуюсь версией Java. У кого-нибудь есть лучшая версия для Java? Достаточно ли хорош его пример, чтобы просто конвертировать напрямую из С# в Java?

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

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

4b9b3361

Ответ 1

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

Например, см. этот список обфускации атак XSS. Готовы ли вы адаптировать регулярное выражение для предотвращения этой реальной атаки на Yahoo и 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')">

Как насчет атак, которые не указаны на этом сайте? Проблема с Джеффом заключается в том, что он не является "белым", как утверждалось. Как кто-то на на этой странице умело отмечает:

Проблема с этим заключается в том, что 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();
}

Ответ 3

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

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

Ответ 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.

Ответ 5

Я извлек из 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, аддона, который регулярно обновляется

Ответ 6

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

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

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

Ответ 7

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

Я бы, вероятно, просто взял "raw" regexp из кода jeffs, если мне это нужно, и вставьте его в

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

и посмотрите, что нужно, чтобы побег ускользнул, а затем используйте его.


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

(Thats, возможно, очень хороший совет для любой копии/вставки)

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

Этот вопрос прекрасно иллюстрирует великолепное применение изучения теории вычислений. Теория вычислений - это область, которая фокусируется на создании математических представлений компьютеров.

Одним из наиболее глубоких исследований в теории вычислений являются доказательства, которые иллюстрируют отношения различных языков.

Некоторые из языковых отношений, которые доказали теоретики вычислений, включают:

enter image description here

Это показывает, что контекстно-свободные языки более мощные, чем обычные языки. Таким образом, если язык явно не зависит от контекста (не зависит от контекста и не является регулярным), то любое регулярное выражение не сможет его распознать.

JavaScript по крайней мере не зависит от контекста, поэтому мы со стопроцентной уверенностью знаем, что разработка регулярного выражения (регулярного выражения), способного перехватить весь XSS, является невозможной задачей.