С одной стороны, если у меня есть
<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 в блоке script, JS в обработчиках событий - если ваш JS-код частично может быть сгенерирован на стороне сервера и может потенциально могут содержать вредоносные данные?