Руководство по правильному выходу из игры в рамках Play - PullRequest
26 голосов
/ 23 апреля 2011

Я пытаюсь определить, как платформа Play поддерживает экранирование.

Это хорошая страница с изложением необходимой функциональности: https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

Так что я пытаюсь связатьчто в шаблонах Play и полностью понять, что Play делает и чего не делает.

ДругоеБеспорядком является поддержка index.json (т.е. использование шаблонов для построения JSON вместо HTML).${} волшебным образом переключается на экранирование JavaScript в документе JSON или по-прежнему экранирует HTML, поэтому все в шаблоне JSON должно иметь явное escapeJavaScript()?

. Также есть метод addSlashes () для http://www.playframework.org/documentation/1.2/javaextensions, но это не совсем подходит для любой ситуации, о которой я могу подумать.(?)

Было бы здорово иметь подробное руководство о том, как сделать все виды побега в Play.Мне кажется, что в некоторых случаях ответ «катите свои», но, может быть, мне не хватает того, что включено.

Ответы [ 2 ]

7 голосов
/ 12 февраля 2013

Я изучал это, поэтому решил написать свой собственный ответ, основываясь на том, что у вас уже было, этот шпаргалка 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: (и сложные атрибуты)

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

CSS экранирование:

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

URL экранирования:

6 голосов
/ 25 апреля 2011

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

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

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

...