Лучший регулярное выражение, чтобы поймать XSS (Cross-Site Scripting) атаки (в Java)?

голоса
20

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

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

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

Задан 24/08/2008 в 01:21
источник пользователем
На других языках...                            


9 ответов

голоса
60

Не делайте этого с регулярными выражениями. Помните, что вы не защищаете только против действительного 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 должен быть чистым. Есть случаи, когда вы можете передать в взломанной 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();
}
Ответил 11/02/2009 в 01:59
источник пользователем

голоса
10

Проект Application Security Open Web (OWASP) есть несколько предложения для дезинфицирующего ввода. Смотри, например:

Ответил 26/08/2008 в 10:46
источник пользователем

голоса
4

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

<А альт = "инъекция XSS" HREF = "http://www.malicous.com/bad.php">

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

Ответил 10/02/2009 в 20:04
источник пользователем

голоса
4

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

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

Ответил 24/08/2008 в 01:45
источник пользователем

голоса
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, аддон, которые получают регулярно обновляемый

Ответил 07/06/2014 в 08:12
источник пользователем

голоса
1
^(\s|\w|\d|<br>)*?$ 

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

^(\s|\w|\d|<br>|<ul>|<\ul>)*?$
Ответил 01/06/2009 в 23:39
источник пользователем

голоса
0

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

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

Ответил 09/09/2014 в 14:25
источник пользователем

голоса
0

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

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

Ответил 11/02/2009 в 20:30
источник пользователем

голоса
0

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

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

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

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


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

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

Ответил 26/08/2008 в 11:25
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more