Подтвердить что ты не робот

Нужно ли "избегать" символа "<" и ">" для строки javascript?

Иногда серверная сторона генерирует строки, которые будут встроены в встроенный код JavaScript. Например, если "ASPNAME" должно быть создано "UserName". Тогда это выглядит.

<script>
   var username = "<%UserName%>";
</script>

Это небезопасно, потому что пользователь может иметь свое имя

</script><script>alert('bug')</script></script>

Это уязвимость XSS.

Итак, в основном, код должен быть:

<script>
   var username = "<% JavascriptEncode(UserName)%>";
</script>

Что JavascriptEncode - это добавить charater "\" до "/" и "'" и "". Итак, выходной html похож.         var username = "</ script > alert (\ 'bug \') </script> </script> ";   

Браузер не будет интерпретировать " </ script > " как конец блока script. Таким образом, XSS во избежание.

Однако все еще есть "<" и " > ". Также предлагается избегать этих двух персонажей. Прежде всего, я не считаю, что это хорошая идея изменить "<". "& lt;" и " > " на "& gt;" Вот. И я не уверен, что меняю "<" на "\ <" и " > " до "\ > " распознается для всех браузеров. Кажется, нет необходимости делать дальнейшее кодирование для "<" и " > ".

Есть ли какие-либо предложения по этому поводу?

Спасибо.

4b9b3361

Ответ 1

У проблемы есть разные ответы в зависимости от того, какой язык разметки вы используете.

Если вы используете HTML, вы не должны представлять их с сущностями, поскольку script элементы помечены как содержащие CDATA.

Если вы используете XHTML, вы можете представить их как CDATA с явными маркерами CDATA, или вы можете представлять их с объектами.

Если вы используете XHTML, но используете его как text/html, вам нужно написать что-то, что соответствует правилам XHTML, но все же работает с синтаксисом text/html. Обычно это означает использование явных маркеров CDATA и комментирование их в JavaScript.

<script type="text/javascript">
// <![CDATA[
  …
// ]]>
</script>

Некоторое время назад я немного писал о о хау и whys этого.

Ответ 2

Нет, вам не следует избегать < и >, используя HTML-объекты внутри <script> в HTML.

  • Используйте правила экранирования строки JavaScript (замените \ на \\ и " на \")
  • и замените все события </ на <\/, чтобы избежать выхода из элемента <script>.

В XHTML это сложнее.

  • Если вы отправляете XHTML как XML (способ, который несовместим с IE) и не используете блок CDATA, тогда вам нужно избегать сущностей в дополнение к стиранию строки JavaScript.
  • Если вы отправляете XHTML в формате XML и используете блок CDATA, то не избегайте сущностей, а замените ]]> на ]]]]><![CDATA[>, чтобы предотвратить выход из него (в дополнение к экранированию строки JavaScript).
  • Если вы отправляете XHTML в качестве text/html (что делает 99% людей), вам нужно использовать XML CDATA-блок, экранирование XML-CDATA и HTML файлы сразу.

Ответ 3

Дешевый и простой способ:

<script type="text/javascript">
    var username = "<%= Encode(UserName) %>";
</script>

где схема кодирования в Encode должна преобразовывать каждый символ ввода в соответствующее представление \xABCD, совместимое с JavaScript.

Еще один дешевый и простой способ:

<script type="text/javascript">
    var username = decodeBase64("<%= EncodeBase64(UserName) %>");
</script>

если вы имеете дело только с ASCII.

Конечно, pst поражает гвоздь на голове строгим способом его выполнения.