Сведения о вопросе

Kimsanov

03:01, 6th August, 2020

Теги

java   html   regex   xss    

Лучше всего regex поймать атаку XSS (Межсайтовый сценарий) (в Java)?

Просмотров: 502   Ответов: 9

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

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

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



  Сведения об ответе

DINO

11:30, 26th August, 2020

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

Например, смотрите этот список запутанных атак XSS . Готовы ли вы адаптировать regex, чтобы предотвратить эту реальную атаку на 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();
}


  Сведения об ответе

screen

12:35, 15th August, 2020

  Сведения об ответе

PROGA

14:34, 21st August, 2020

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

< это Alt="инъекции xss" href="http://www.malicous.com/bad.php" >

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


  Сведения об ответе

screen

08:30, 10th August, 2020

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


  Сведения об ответе

crush

14:39, 21st August, 2020

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

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

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


  Сведения об ответе

park

22:18, 12th August, 2020

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

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


  Сведения об ответе

screen

16:53, 4th August, 2020

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

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

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

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


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

(Это, вероятно, довольно здравый совет для любого copy/paste)


  Сведения об ответе

$DOLLAR

09:09, 2nd August, 2020

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

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


  Сведения об ответе

qwerty101

00:29, 16th August, 2020

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

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

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

enter image description here

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться