Нужно ли "экранировать" символ "<" и ">" для строки JavaScript? - PullRequest
17 голосов
/ 23 апреля 2009

Иногда на стороне сервера генерируются строки для встраивания в встроенный код JavaScript. Например, если «Имя пользователя» должно быть сгенерировано ASP.NET. Тогда это выглядит так.

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

Это небезопасно, поскольку у пользователя может быть его / ее имя

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

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

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

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

Что делает JavascriptEncode , так это добавляет символ "\" перед "/" и "'" и "" ". Таким образом, выходной html похож. var username = " alert (\ 'bug \') ";

Браузер не будет интерпретировать «» как конец блока скрипта. Итак, XSS избегают.

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

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

Спасибо.

Ответы [ 3 ]

16 голосов
/ 23 апреля 2009

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

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

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

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

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

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

13 голосов
/ 26 мая 2009

Нет, вы не должны избегать < и >, используя 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 одновременно.
2 голосов
/ 02 октября 2009

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

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

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

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

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

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

Конечно, pst ударил ногтем по голове со строгим способом сделать это.

...