Руководство по правильному экранированию в режиме воспроизведения
Я пытаюсь определить, как поддерживает фреймворк Play.
Это хорошая страница, в которой перечислены необходимые функции:
https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
Итак, я пытаюсь связать это с функциями Play template и полностью понять, что делает и что делает.
Еще одна путаница - поддержка index.json
(т.е. использование шаблонов для сборки JSON вместо HTML). ${}
волшебным образом переключается на экранирование JavaScript в документе JSON или все еще выходит из HTML, поэтому все в шаблоне JSON должно иметь явный escapeJavaScript()
?
Также есть addSlashes() на http://www.playframework.org/documentation/1.2/javaextensions, но это не кажется правильным для любой из ситуаций, которые я могу думать из. (?)
Было бы здорово иметь подробное руководство о том, как делать все вкусы побега в Play. Мне кажется, что в нескольких случаях ответ "катитесь", но, возможно, мне не хватает того, что включено.
Ответы
Ответ 1
Я рассматривал это так, что решил написать свой собственный ответ, основываясь на том, что у вас уже было, это обходной лист OWASP и некоторые эксперименты с моими собственными
HTML-экранирование:
Активация атрибута: (общие атрибуты)
- Это обрабатывается при воспроизведении, пока вы обертываете свои атрибуты в двойные кавычки (") и используете ${}.
- Для сложных атрибутов (href/src/etc.) см. JavaScript ниже
- Пример небезопасного кода
-
<a id=${data.value} href="...">...</a>
-
<a id='${data.value}' href="...">...</a>
- Это сломается с этим для data.value:
-
% href=javascript:alert('XSS')
-
%' href=javascript:alert(window.location)
JavaScript escaping: (и сложные атрибуты)
CSS escaping:
- Не уверен, поскольку мне это не нужно.
- Я бы предположил, что вам нужно создать свое собственное. Надеюсь, есть что-то там, чтобы манипулировать струнами для вас.
URL-адрес экранирования:
Ответ 2
Я думаю, что вы абсолютно правы в своем резюме. Игра дает вам некоторые из решений, но не все. Тем не менее, в двух местах, где Play ничего не предлагает (в CSS и атрибуте), я не могу найти его в этом.
В стандарте OWASP указано, что вам следует избегать ненадежного кода. Таким образом, единственный способ, которым у вас был бы ненадежный код в вашем CSS, - это то, что он генерируется динамически. Если он генерируется динамически, то вам нечего останавливать, используя стандартные шаблоны Groovy и, следовательно, используя ${}
и escape()
.
Как и для экранирования атрибута, опять же, единственный раз, когда вам понадобится это, насколько я могу судить, это когда вы создаете свое представление в шаблонах Groovy, так что вы можете использовать ${}
или escape()
.