С одной стороны, если у меня есть
<script>
var s = 'Hello </script>';
console.log(s);
</script>
браузер прекратит блокировку <script>
на ранней стадии, и в основном я испортил страницу.
С другой стороны, значение строки может исходить от пользователя (скажем, через ранее отправленную форму, и теперь строка в итоге вставляется в блок <script>
как литерал), так что вы можете ожидать что-нибудь в этой строке, включая злонамеренно сформированные теги. Теперь, если при создании страницы я экранирую строковый литерал с помощью htmlentities (), значение s будет содержать буквально экранированные сущности, то есть s будет выводить
Hello </script>
, что в данном случае нежелательное поведение.
Один из способов правильного экранирования строк JS в блоке <script>
- избежать косой черты, если она следует за левой угловой скобкой, или просто всегда избегать косой черты, т.е.
var s = 'Hello <\/script>';
Кажется, это работает нормально.
Затем встает вопрос о коде JS в обработчиках событий HTML, который также может быть легко взломан, например,
<div onClick="alert('Hello ">')"></div>
поначалу выглядит корректно, но ломается в большинстве (или во всех?) Браузерах. Это, очевидно, требует полной кодировки сущности HTML.
Мой вопрос: какова наилучшая / стандартная практика для надлежащего охвата всех вышеперечисленных ситуаций - например, JS в блоке сценария, JS в обработчиках событий - если ваш JS-код может быть частично сгенерирован на стороне сервера и потенциально может содержать вредоносные данные?