#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;
перед<
, что приводит к правильному поведению.