Нужно ли "избегать" символа "<" и ">" для строки 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;" Вот. И я не уверен, что меняю "<" на "\ <" и " > " до "\ > " распознается для всех браузеров. Кажется, нет необходимости делать дальнейшее кодирование для "<" и " > ".
Есть ли какие-либо предложения по этому поводу?
Спасибо.
Ответы
Ответ 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
поражает гвоздь на голове строгим способом его выполнения.