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

Руководство по правильному экранированию в режиме воспроизведения

Я пытаюсь определить, как поддерживает фреймворк 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. Мне кажется, что в нескольких случаях ответ "катитесь", но, возможно, мне не хватает того, что включено.

4b9b3361

Ответ 1

Я рассматривал это так, что решил написать свой собственный ответ, основываясь на том, что у вас уже было, это обходной лист OWASP и некоторые эксперименты с моими собственными

HTML-экранирование:

  • ${} или функция escape()

Активация атрибута: (общие атрибуты)

  • Это обрабатывается при воспроизведении, пока вы обертываете свои атрибуты в двойные кавычки (") и используете ${}.
  • Для сложных атрибутов (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: (и сложные атрибуты)

  • Используйте escapeJavaScript(). http://www.playframework.org/documentation/1.2/javaextensions
  • Пример небезопасного кода
    • <a onmouseover="x='${data.value}'; ..." href="...">...</a>
  • Это сломается с этим для data.value:
    • '; javascript:alert(window.location);//

CSS escaping:

  • Не уверен, поскольку мне это не нужно.
    • Я бы предположил, что вам нужно создать свое собственное. Надеюсь, есть что-то там, чтобы манипулировать струнами для вас.

URL-адрес экранирования:

Ответ 2

Я думаю, что вы абсолютно правы в своем резюме. Игра дает вам некоторые из решений, но не все. Тем не менее, в двух местах, где Play ничего не предлагает (в CSS и атрибуте), я не могу найти его в этом.

В стандарте OWASP указано, что вам следует избегать ненадежного кода. Таким образом, единственный способ, которым у вас был бы ненадежный код в вашем CSS, - это то, что он генерируется динамически. Если он генерируется динамически, то вам нечего останавливать, используя стандартные шаблоны Groovy и, следовательно, используя ${} и escape().

Как и для экранирования атрибута, опять же, единственный раз, когда вам понадобится это, насколько я могу судить, это когда вы создаете свое представление в шаблонах Groovy, так что вы можете использовать ${} или escape().