Является ли URLEncoder.encode (строка, "UTF-8") плохой проверкой? - PullRequest
1 голос
/ 15 февраля 2012

В части моего кода J2EE / java я выполняю URLEncoding на выходе getRequestURI(), чтобы санировать его для предотвращения атак XSS, но Fortify SCA считает, что плохая проверка.

Почему?

Ответы [ 2 ]

6 голосов
/ 15 февраля 2012

Ключевым моментом является то, что вам необходимо преобразовать специальные символы HTML в объекты HTML.Это также называется «экранированием HTML» или «экранированием XML».Обычно символы <, >, ", & и ' необходимо заменить на &lt;, &gt;, &quot;, &amp; и &#39;. * 1011.*

Кодировка URL этого не делает.Кодировка URL преобразует специальные символы URL в значения в процентах.Это не экранирование HTML.

В случае веб-приложений экранирование HTML обычно выполняется на стороне просмотра, именно там, где вы снова отображаете контролируемый пользователем ввод.В случае веб-приложений Java EE это зависит от используемой вами технологии представления.

  1. Если в веб-приложении используется современная технология просмотра Facelets, вам не нужно избегать его самостоятельно.Facelets уже будут неявно делать это.

  2. Если в веб-приложении используется устаревшая технология просмотра JSP, вам необходимо убедиться, что вы используете JSTL <c:out> tag или fn:escapeXml() функцию дляПовторите отображение ввода, управляемого пользователем.

    <c:out value="${bean.foo}" />
    <input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
    
  3. Если веб-приложение очень унаследовано или плохо разработано и использует сервлеты или скриптлетов для печати HTML, то выбольшая проблема.Здесь нет встроенных тегов или функций, не говоря уже о методах Java, которые могут экранировать сущности HTML.Вы должны либо написать какой-нибудь метод escape() самостоятельно, либо использовать для этого Apache Commons Lang StringEscapeUtils#escapeHtml().Затем вам нужно убедиться, что вы используете его везде, где печатаете ввод, управляемый пользователем.

    out.print("<p>" + StringEscapeUtils.escapeHtml(request.getParameter("foo")) + "</p>");
    

    Гораздо лучше было бы перепроектировать это устаревшее веб-приложение для использования JSP с JSTL.

0 голосов
/ 15 февраля 2012

Кодировка URL не влияет на некоторые значимые символы, включая одинарные кавычки (') и круглые скобки, поэтому кодировка URL будет проходить через неизменные определенные полезные данные.

Например,

onload'alert(String.fromCharCode(120))'

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

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

Если вы хотите фильтровать входные данные как дополнительный уровень безопасности, убедитесь, что ваш фильтр обрабатывает все кавычки (включая обратную галочку) и круглые скобки как возможный коди запретить их, если в этом нет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...