Выделение HTML-Entity для предотвращения XSS

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

& -> & 
< -> &lt; 
> -> &gt;

В OWASP Я читал, что есть больше символов, которые нужно избегать.

Для атрибутов я делаю другой вид экранирования:

& -> &amp; 
" -> &quot;

Обеспечивается, что все атрибуты заключены в ". Это делает меня уверенным в моих html-атрибутах, но не о самом HTML.

Интересно, если моего побега достаточно. Я прочитал этот пост, но я до сих пор не уверен в своей заботе.

(JavaScripts экранируются с помощью OWASP-библиотеки)

Ответ 1

Я использую библиотеку OWASP (ESAPI), чтобы избежать строк для разных типов отображения, используйте:

String html = ESAPI.encoder().encodeForHTML("hello < how > are 'you'");
String html_attr = ESAPI.encoder().encodeForHTMLAttribute("hello < how > are 'you'");
String js = ESAPI.encoder().encodeForJavaScript("hello < how > are 'you'");

HTML (предположим, jsp)

<tag attr="<%= html_attr %>" onclick="alert('<%= js %>')"><%= html %></tag>

Обновить (2017)

Поскольку ESAPI-кодеры считаются legacy, лучшая альтернатива была создана и активно поддерживается, я настоятельно рекомендую использовать OWASP Java Encoder.

Если ваш проект уже использует ESAPI, добавлена ​​интеграция, которая позволит вам использовать эту библиотеку для кодирования.

Использование объясняется на странице wiki, но, ради завершения, вы можете использовать его для контекстного кодирования ваших данных

// HTML Context
String html = Encoder.forHtml("u<ntrus>te'd'");

// HTML Attribute Context
String htmlAttr = Encoder.forHtmlAttribute("u<ntrus>te'd'");

// Javascript Attribute Context
String jsAttr = Encoder.forJavaScriptAttribute("u<ntrus>te'd'");

HTML (предположим, jsp)

<div data-attr="<%= htmlAttr %>" onclick="alert('<%= jsAttr %>')">
    <%= html %>
</div>

PS: существует больше контекстов и поддерживается библиотекой

Ответ 2

Я рекомендую вам использовать библиотеку Appache Common Lang для удаления строк, для exmaple для выхода из HTML:

String escapedString = org.apache.commons.lang.StringEscapeUtils.escapeHtml(String str);

В библиотеке есть много полезных методов для выхода в HTML, XML, Javascript.