уязвимости, позволяющие пользователю определять innerHTML

#javascript #html #innerhtml

#javascript #HTML #innerhtml

Вопрос:

Допустим, у меня есть элемент <textarea> и <div> , и когда пользователь вводит html, CSS или что угодно по своему усмотрению) в текстовую область, тогда его входные данные устанавливаются как innerHTML элемента <div> , используя javascript.

Каковы уязвимости, позволяющие пользователю определять содержимое элемента <div>?

Комментарии:

1. вы говорите о чем-то вроде предварительного просмотра в реальном времени?

2. @Demian Да, div будет отображать html по мере ввода.

Ответ №1:

Если введенный пользователем контент не покидает страницу, существует не больший риск, чем редактирование DOM через firebug или chrome inspector. Если вы принимаете их входные данные, а затем отображаете их как есть, это представляет собой огромный риск для безопасности, особенно когда на вашем веб-сайте находятся другие пользователи.

Комментарии:

1. для содержимого, которое они вводят, чтобы «не покидать страницу», должен ли я использовать iframe ?

2. Нет, вы просто обрабатываете нажатие кнопки отправки, извлекаете текст textarea и устанавливаете innerHTML для div в это значение, в вашем случае.

3. Я все еще не понимаю, о чем вы говорите: ( Если вы поместите текст textarea в качестве innerHTML для div, не будет ли это уязвимым для вредоносного JavaScript?

4. Нет, если вы не отправляете текст, введенный пользователем, на сервер. Если вы просто сохраните его на этой странице, риска нет. Они могут просто открыть свой инспектор и все равно сами возиться с HTML (вы никогда не сможете это остановить, я могу сделать это на этой странице прямо сейчас, если захочу). Если вы обрабатываете их текст, а затем отображаете его для других пользователей, именно в этом вы и ваши пользователи становитесь уязвимыми.

5. Отлично, спасибо! Теперь все имеет смысл 🙂

Ответ №2:

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

Если вы этого не сделаете, пользователь может загрузить javascript, который будет выполняться при следующем просмотре этой страницы другим пользователем.

Я хочу изменить свой ответ, чтобы учесть комментарии @Brigham. Escape работает надежно, только если вы имеете дело с innerHTML чего-то вроде вкладки div, если вы имеете дело с использованием пользовательского значения в качестве атрибута или внутри тега script, тогда экранирование / кодирование не будет работать.

Я отсылаю вас к руководству OWASP XSS (на которое @Brigham изначально обратил мое внимание) для получения дополнительной информации: https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#Untrusted_Data

Комментарии:

1. Кодирование содержимого для устранения возможности Javascript довольно сложно. Например, в IE можно запускать Javascript в CSS: owasp.org/index.php /…

2. @Brigham, спасибо за эту ссылку, это очень интересно. Я обязательно буду использовать его в качестве ссылки. Однако этот конкретный вопрос не касается размещения пользовательского ввода в произвольной позиции в документе. Вопрос конкретно о замене тела div. В этом случае кодирование должно позаботиться обо всех возможных атаках. Даже в документе, на который вы ссылались, указано следующее: «Кодировка сущности HTML подходит для ненадежных данных, которые вы помещаете в тело HTML-документа, например, внутри тега <div> «.

Ответ №3:

Пользователь может создавать межсайтовые сценарии. Он может внедрять вредоносный код на стороне клиента

Взгляните на http://en.wikipedia.org/wiki/Cross-site_scripting

Комментарии:

1. Я почти уверен, что OP говорит о предварительном просмотре в реальном времени того, что пользователь вводит, и в этом случае зачем кому-то запускать что-либо вредоносное на своем собственном компьютере (не говоря уже о том, что эта функциональность не соответствует определению XSS)

Ответ №4:

Все, что они хотят, может включать <script> тег, который извлекает файл .js с их собственного сервера. Затем, если вы покажете это содержимое другому пользователю, скрипт может делать все, что угодно, чтобы извлечь информацию из ничего не подозревающего пользователя.