HTML-сущность, выходящая для предотвращения XSS - PullRequest
12 голосов
/ 18 января 2012

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

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

OWASP гласит, что есть еще несколько символов, которые нужно экранировать.

Для атрибутов я делаю еще один вид побега:

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

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

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

(JavaScripts экранируется с OWASP-библиотекой)

Ответы [ 2 ]

31 голосов
/ 18 января 2012

Я также использую библиотеку 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 считаются устаревшими , была создана и активно поддерживается лучшая альтернатива, поэтому я настоятельно рекомендую использовать вместо нее OWASP Java Encoder .

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

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

// 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 голосов
/ 18 января 2012

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

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

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

...