Предотвращение DOM XSS -- javascript поле с участием xss пол Связанный проблема

Preventing DOM XSS


8
vote

проблема

русский

Мы недавно мы на борту чужого кода, который с тех пор был проверен, и не удалось, для атаки DOM XSS. В основном фрагменты URL передаются непосредственно в селекторы jQuery и включают введение JavaScript, например:

 <код> "http://website.com/#%3Cimg%20src=x%20onerror=alert%28/XSSed/%29%3E)" $(".selector [thing="+window.location.hash.substr(1)+"]");   

Проблема в том, что это происходит по всему их сценариям и потребуется много регрессионного тестирования для исправления E.G. Если мы избегаем данных, если операторы не будут возвращать true, так как данные не будут совпадать.

Обеспокоенный файл JavaScript ConsateNated в виде сборки из нескольких небольших файлов, так что это становится еще сложнее исправить.

Есть ли способ предотвратить эти атаки DOM XSS с помощью некоторого глобального кода без необходимости проходить и отладки каждого экземпляра.


Я предложил добавить немного регулярное выражение в верхней части скрипта для обнаружения Common Chars, используемых в XSS-атаках, и просто убить скрипт, если он возвращает True.

 <код>  var xss = window.location.href.match(/(javascript|src|onerror|%|<|>)/g);  if(xss != null) return;   

Это похоже на работу, но я не довольна на 100% с решением. У кого-нибудь есть лучшее решение или любое полезное понимание, которое они могут предложить?

Английский оригинал

We recently on-boarded someone else's code which has since been tested, and failed, for DOM XSS attacks. Basically the url fragments are being passed directly into jQuery selectors and enabling JavaScript to be injected, like so:

"http://website.com/#%3Cimg%20src=x%20onerror=alert%28/XSSed/%29%3E)" $(".selector [thing="+window.location.hash.substr(1)+"]"); 

The problem is that this is occurring throughout their scripts and would need a lot of regression testing to fix e.g. if we escape the data if statements won't return true any more as the data won't match.

The JavaScript file in question is concatenated at build time from many smaller files so this becomes even more difficult to fix.

Is there a way to prevent these DOM XSS attacks with some global code without having to go through and debug each instance.


I proposed that we add a little regular expression at the top of the script to detect common chars used in XSS attacks and to simply kill the script if it returns true.

 var xss = window.location.href.match(/(javascript|src|onerror|%|<|>)/g);  if(xss != null) return; 

This appears to work but I'm not 100% happy with the solution. Does anyone have a better solution or any useful insight they can offer?

</div
     
       
       

Список ответов

6
 
vote
vote
Лучший ответ
 

Если вы придерживаетесь решения для регулярного выражения, который далеко от идеала, но может быть лучшим выбором, учитывая ваши ограничения:

, а не определяя регулярное выражение, соответствующий вредоносному хэшесу (<код> /(javascript|src|onerror|%|<|>)/g ), я бы определил регулярное выражение, соответствующую звуковому хэсу (например, <код> /^[w_-]*$/ ).

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

 

If you stick to the regular expression solution, which is far from ideal but may be the best choice given your constraints:

Rather than defining a regular expression matching malicious hashes (/(javascript|src|onerror|%|<|>)/g), I would define a regular expression matching sound hashes (e.g. /^[w_-]*$/).

It will avoid false-positive errors (e.g. src_records), make it clear what is authorized and what isn't, and block more complex injection mechanisms.

</div
 
 
     
     
0
 
vote

Ваша проблема вызвана тем, что входная строка jQuery может рассматриваться как HTML, не только в качестве селектора.

Используйте нажимых <код> document.querySelector() вместо jQuery.

Если для вас важен поддержка IE7-, вы можете попробовать Sizzle селекторный двигатель, который, вероятно, в отличие от jQuery и аналогичных Для собственного <код> querySelector() не интерпретирует входную строку как нечто отличное от селектора.

 

Your issue is caused by that jQuery's input string may be treated as HTML, not only as selector.

Use native document.querySelector() instead of jQuery.

If support for IE7- is important for you, you can try Sizzle selector engine which likely, unlike jQuery and similar to native querySelector(), does not interpret input string as something different from a selector.

</div
 
 
 
 

Связанный проблема

0  Обратный вызов для GridView Yii2 CheckboxColumn  ( Callback for yii2s gridview checkboxcolumn ) 
У меня есть <код> GridView (yii2) и один из столбцов - это логический тип данных. Я хочу быть в состоянии переключить это значение и сохранить его в моей баз...

0  Расчет разницы в положении курсора  ( Calculating difference in cursor position ) 
Я хочу создать что-то, что проводит и показывает каждое из некоторых изображений, когда пользователь перемещает мышь через экран. Я изначально пытался испол...

0  Проблема космического дерева JavaScript  ( Space tree javascript problem ) 
Я использую Space Tree Java Script для создания диаграммы организации. Теперь, когда это работает нормально, но проблема в том, что я не могу печатать график ...

41  Тест, если элемент уже имеет jQuery DatePicker  ( Test if element already has jquery datepicker ) 
У меня есть форма со многими входными элементами. Некоторые поля встречаются на сегодняшний день с jQuery UI DatePicker Arlaedy прилагается: <код> $("#someE...

6  Как вызвать функцию JavaScript в верхней раме?  ( How to call a javascript function in the top frame ) 
Это кажется действительно простым, но как мне позвонить функцию JavaScript, которая определяется в HTML верхнего уровня, от детской рамы? <код> top html doc...

8  Почему я не могу удалить это cookie?  ( Why cant i delete this cookie ) 
Хорошо, вот 411 - у меня есть следующий обработчик событий в моем файле Global.Asax.cs: <код> private void Global_PostRequestHandlerExecute(object sender, E...

1  Как сила использует «это» в CoffeeScript?  ( How force use this in coffeescript ) 
Мне нужно определить один статический метод в матчах, как это: <код> class @MotherClass @test = => Foo.bar(this) # same with @ Но если вы попробуе...

0  JavaScript -Paste из буфера обмена к определенной ячейке в Excel  ( Javascript paste from clipboard to specific cell in excel ) 
У меня есть функция JS, которая копирует изображение от Div на буфер обмена (только в IE) и вставляет его в Excel. Я хотел бы знать, как я могу вставить содер...

7  Объект IIFE и Window?  ( Iife and window object ) 
<Код> IIFE Что нужно получить доступ без переопределения <код> window объект - можно рассматривать как: что-то вроде ( jQuery Пример): <код> $(function...

0  Есть ли способ определить проверенную переключатель перед отправкой формы?  ( Is there a way to determine checked radio button before form submission ) 
Я работаю над созданием динамической формы проверки полосы. Я хотел бы, чтобы форма изменилась на основе выбора радиопередачи. Вот код у меня есть до сих пор....

1  Передача нескольких массивов на график C3  ( Passing multiple arrays to c3 graph ) 
У меня есть API, давая мне несколько массивов, которые я должен поместить на диаграмме линии C3. Кажется, я умею построить просто хорошо, но если я начну прох...

0  Почему JavaScript не стреляет? [закрыто]  ( Why javascript is not firing ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

0  jQuery работает в Firefox, Safari, но не в Chrome  ( Jquery working in firefox safari but not in chrome ) 
Я написал какой-то код с JQuery Works в Firefox, Safari и IE9. Но Chrome это не нравится. Никаких очевидных MSG в Chrome Console не подходит. Я ударяю стену, ...

0  Регулировка часовой пояс в JavaScript на основе IP-адреса  ( Timezone adjustment in javascript based on ip location ) 
<Код> offset = new Date().getTimezoneOffset(); Это дает вам смещение временизона, основанное на компьютерных часах или часовой зоне браузера. Есть ли спосо...

6  Office 365 График API от JavaScript: Как правильно аутентифицировать  ( Office 365 graph api from javascript how to properly authenticate ) 
Я не ненавижу ОАУТ, но я ненавижу себя, потому что не смог обернуть голову вокруг концепции. Сказав это, вот мой вопрос: я пытаюсь позвонить в API Office Grap...