фильтрация экранированных угловых скобок в javascript

#javascript #html #escaping #security #entities

#javascript #HTML #экранирование #Безопасность #сущности

Вопрос:

У меня есть функция javascript, которая позволяет пользователям размещать произвольные текстовые строки на странице. Я не хочу, чтобы они могли вставлять html или другой код, просто обычный текст.

Итак, я полагаю, что удаление всех угловых скобок ( < > ) помогло бы. (Меня не волнует, что у них «сломанный» html на странице или что они не могут вставить угловые скобки в свой текст) Затем я понял, что мне нужно отфильтровать экранированные угловые скобки ( amp;< amp;> ) и, возможно, другие.

Что все это мне нужно отфильтровать для безопасности? Поможет ли удаление всех угловых скобок?

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

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

2. Марсело, ты можешь использовать это в качестве ответа? Тогда я могу это принять 🙂

3. Это зависит от того, как он это делает. Он должен проверить, применимо ли ваше утверждение к его ситуации или нет.

4. Джордж — существуют ли какие-либо браузеры, которые будут анализировать экранированные угловые скобки как реальный html?

5. Нет, не при экранировании. Возможно, я неправильно понял комментарий Марсело. Это просто не кажется правильным.

Ответ №1:

Поможет ли удаление всех угловых скобок?

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

Ответ №2:

Убедитесь, что первое, что вы делаете, это заменяете amp; на amp;amp;

a) Для HTML-контента должно быть достаточно просто < .

б) Для значений атрибутов, например, если они вводятся <input name="sendtoserver" value="custom text"/> , вам нужно позаботиться о двойных кавычках, но это все, что необходимо. Тем не менее, неплохо также сделать < и > .

Это зависит от контекста. Если вы хотите перестраховаться, попросите свой JavaScript использовать innerText который не требует кодирования, но вы можете установить css на white-space:pre-wrap . Это менее подвержено ошибкам, но также менее совместимо с браузером.

c) В общих чертах отметим, что при экранировании ограничителей строк JavaScript с использованием обратной косой черты вас может подкрасться элемент, который заключается в том, что если вы размещаете контент в скрипте, вам нужно позаботиться о </script> (не чувствителен к регистру) Вы можете просто экранировать </ или / этого должно быть достаточно

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

1. Если убрать все угловые скобки, не сделает ли это все остальное спорным?

2. Элемента a недостаточно, чтобы позаботиться о b . Например, вставка JavaScript в onmouseover="..bad code here.." может произойти, если вы не будете кодировать " . Пункт c действительно применим только к экранированию JavaScript. Отредактировано

3. Если применяется элемент a, то b никогда бы не произошло, верно? <input ... просто стало бы input... и, следовательно, не было бы проанализировано, верно?

4. Да, единственное, что необходимо в этом случае, это заменить amp; на amp;amp; и < на amp;< .

5. Не для безопасности, а просто чтобы было приятно. Если кто-то вводит please install multiplyamp;divide handlers . Это будет отображаться на экране как install multiply÷ handlers . Но если вы используете амперсанд, как я предлагаю, код будет таким, please install multiplyamp;amp;divide handlers что приводит к правильному поведению. Более того , если вы замените < перед amp; , и кто-нибудь введет If it is <5 , результатом будет If it is amp;amp;<5 то, что на экране выглядит как If it is amp;<5 . вместо этого вы должны заменить amp; перед < , что приводит к правильному поведению.