Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Лучше всего regex поймать атаку XSS (Межсайтовый сценарий) (в Java)?
Джефф действительно написал об этом в Sanitize HTML . Но его пример находится в C#, и я на самом деле больше заинтересован в версии Java. У кого-нибудь есть лучшая версия для Java? Достаточно ли хорош его пример, чтобы просто преобразовать непосредственно из C# в Java?
[Update] я поставил награду за этот вопрос, потому что SO не был так популярен, когда я задавал этот вопрос, как сегодня (*). Что же касается всего, что связано с безопасностью, то чем больше людей в нее заглядывают, тем лучше!
(*) На самом деле, я думаю, что он все еще был в закрытом бета-тестировании
Не делайте этого с регулярными выражениями. Помните, что вы защищаете не только от действительного 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<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</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();
}
В проекте Open Web Application Security Project (OWASP) есть несколько предложений по очистке ваших входных данных. Смотрите например:
- Java Оглавление
- Как выполнить кодировку объекта HTML в Java
- Как добавить логику проверки в HttpServletRequest
Я не уверен, что использование регулярного выражения-лучший способ найти весь подозрительный код. Регулярные выражения довольно легко обмануть, особенно когда речь идет о сломанной HTML. Например, регулярное выражение, указанное в ссылке Sanitize HTML, не сможет удалить все элементы 'a', имеющие атрибут между именем элемента и атрибутом 'href':
< это Alt="инъекции xss" href="http://www.malicous.com/bad.php" >
Более надежный способ удаления вредоносного кода-это использование парсера XML, который может обрабатывать все виды документов HTML (Tidy, TagSoup и т. д.) и выбирать элементы для удаления с помощью выражения XPath. После того, как документ HTML будет проанализирован в документ DOM, элементы для повторного вызова могут быть найдены легко и безопасно. Это даже легко сделать с XSLT.
Я извлек из 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, аддона, который регулярно обновляется
[\s\w\.]* . Если он не совпадает, у вас есть XSS. Может быть. Обратите внимание, что это выражение допускает только буквы, цифры и точки. Он избегает всех символов, даже полезных, из страха перед XSS. Как только вы позволите &,, у вас появятся заботы. И просто заменить все экземпляры & на & недостаточно. Слишком сложно доверять :P. очевидно, что это запретит много законного текста (вы можете просто заменить все не совпадающие символы на a ! или что-то еще), но я думаю, что это убьет XSS.
Идея просто разобрать его как html и создать новый html, вероятно, лучше.
Самая большая проблема при использовании кода jeffs - это@, который в настоящее время недоступен.
Я бы, вероятно, просто взял "raw" regexp из кода jeffs, если бы мне это было нужно, и вставил его в
http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html
и увидеть, что вещи, нуждающиеся в побеге, спасаются, а затем используют его.
Принимая использование этого regex в виду, я бы лично убедился, что точно понимаю, что я делаю, почему и какие последствия будут, если я не преуспею, прежде чем копировать / вставлять что-либо, как и другие ответы, пытаются помочь вам.
(Это, вероятно, довольно здравый совет для любого copy/paste)
Старый поток, но, возможно, это будет полезно для других пользователей. Существует поддерживаемый инструмент уровня безопасности для php: https://github.com/PHPIDS/ он основан на наборе regex, который вы можете найти здесь:
https://github.com/PHPIDS/PHPIDS/blob/master/lib/IDS/default_filter.xml
Этот вопрос прекрасно иллюстрирует большое применение изучения теории вычислений. Теория вычислений-это область, которая фокусируется на создании математических представлений компьютеров.
Одним из наиболее глубоких исследований в теории вычислений являются доказательства, иллюстрирующие взаимосвязи различных языков.
Некоторые из языковых отношений, которые доказали теоретики вычислений, включают:
Это показывает, что контекстно-свободные языки являются более мощными, чем обычные языки. Таким образом, если язык явно свободен от контекста (context free and not regular), то ни одно регулярное выражение не может его распознать.
JavaScript по крайней мере контекстно свободен, поэтому мы знаем со стопроцентной уверенностью, что разработка регулярного выражения (regex), способного поймать все XSS, является невыполнимой задачей.