关于java:HTML-Entity转义防止XSS

HTML-Entity escaping to prevent XSS

我有一些用户输入。在我的代码中,我确保以下符号被转义:

1
2
3
& -> &
< -> <
> -> >

OWASP 声明有更多的字符需要转义。

对于属性,我做了另一种转义:

1
2
& -> &
" ->"

这确保所有属性都被"包围。这让我确定我的 html 属性,而不是 HTML 本身。

我想知道我的逃跑是否足够。我读过这篇文章,但我仍然不确定我的担忧。

(JavaScript 使用 OWASP 库进行转义)


我也使用 OWASP (ESAPI) 库,为不同类型的显示转义字符串,使用 :

1
2
3
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)

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

更新 (2017)

由于 ESAPI 编码器被认为是遗留的,因此已经创建了一个更好的替代方案并且正在积极维护中,我强烈建议使用 OWASP Java 编码器。

如果您的项目已经使用 ESAPI,则添加了一个集成,允许您使用此库进行编码。

在他们的 wiki 页面上解释了用法,但为了完整起见,您可以使用它来对数据进行上下文编码:

1
2
3
4
5
6
7
8
// 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)

1
2
" onclick="alert('<%= jsAttr %>')">
    <%= html %>

PS: 更多的上下文存在并且被库支持


我推荐你使用 Appache Common Lang 库来转义字符串,例如转义 HTML:

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

该库有许多有用的方法可以在 HTML、XML、Javascript 中进行转义。