автоматический выход для предотвращения XSS - PullRequest
1 голос
/ 22 марта 2011

(при рендеринге шаблона HTML)

<hidden name=”param${ns?htmlattr}” />
<a href=”${url?urlencode}”>${usercontent?htmlencode}</a>
${rawhtml?htmlliteral}
<script>
var a = “${str?jsstr}”; //null becomes “”
var b = ${str?quote,jsstr}; //allow null, render quotes if nonnull
var c = ${func?jsliteral}
var ${func?jsidentifier} = null;
</script>
  • jsstr избегает \t\b\f\n\r\\\'\" и </
  • Jsliteral Escape </
  • jsidentifier заменяет не-alnum на фиктивный символ
  • xmlattr экранирует <>& и фильтрует недопустимые символы UTF-8
  • htmlencode кодирует почти все крайние случаи в такие вещи, как &amp;
  • кавычка приводит к выводу строки в кавычках (включая пустую) или null

Некоторые из них могут не иметь отношения к безопасности - они просто помогают коду оставаться в здравом уме. Какой режим выхода мы выбираем по умолчанию, чтобы предотвратить XSS - быть «более безопасным» по умолчанию? Что, если мы по умолчанию установим наиболее ограничивающий (htmlencode) и ослабим / переключим режимы excape оттуда?

Мне не интересно обсуждать достоинства всех этих режимов выхода - к лучшему или худшему, они все существуют в нашей кодовой базе. Мне не хватает каких-либо режимов? Есть хороший материал для чтения?

1 Ответ

1 голос
/ 23 марта 2011

Взгляните на http://js -quasis-libraries-and-repl.googlecode.com / svn / trunk / safetemplate.html

Это определяет контексты в HTML и отображение этих контекстов на экранирующие функции.

Для работоспособного примера посмотрите на http://js -quasis-libraries-and-repl.googlecode.com / svn / trunk / index.html . Попробуйте начать с примеров «Безопасный HTML» из выпадающего меню в правом верхнем углу.

Если обратиться к вашему конкретному примеру, jsliteral выглядит немного сложновато. Какую выгоду вы получаете от html-кодирования внутри блока <script>? Содержание CDATA.

Что охраняют jsidentifier и jsliteral? Остановят ли они назначение опасных идентификаторов, таких как eval? Они, вероятно, должны предотвратить <!-- в дополнение к </, поскольку введенное /*<!-- может привести к игнорированию </script>, что может позволить последующей интерполяции маскироваться под содержимое скрипта.

...