我有一些用户输入。在我的代码中,我确保转义以下符号:
& -> &
< -> <
> -> >
OWASP表示有更多的字符要被转义。
对于属性,我会进行另一种转义:
& -> &
" -> "
这确保所有属性都包含在“。这使我确定了我的html属性,但不是HTML本身。
我想知道我的逃跑是否足够。我读过this post,但我仍然不确定我的担忧。
(JavaScripts使用OWASP-Library进行转义)
答案 0 :(得分:31)
我也使用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
,则会添加integration,允许您使用此库进行编码。
用法在他们的wiki page上进行了解释,但为了完成,您可以使用它来对数据进行上下文编码:
// 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:存在更多上下文并受库支持
答案 1 :(得分:2)
我建议您使用Apache Common Lang库来转义字符串,例如转义HTML:
String escapedString = org.apache.commons.lang.StringEscapeUtils.escapeHtml(String str);
该库有许多有用的方法可以在HTML,XML,Javascript中进行转义。