HTML-Entity 转义以防止 XSS
Posted
技术标签:
【中文标题】HTML-Entity 转义以防止 XSS【英文标题】:HTML-Entity escaping to prevent XSS 【发布时间】:2012-02-13 03:23:54 【问题描述】:我有一些用户输入。在我的代码中,我确保以下符号被转义:
& -> &
< -> <
> -> >
OWASP 表示有更多字符需要转义。
对于属性,我做了另一种转义:
& -> &
" -> "
这确保了所有属性都包含在 " 中。这让我可以确定我的 html 属性,但不能确定 HTML 本身。
我想知道我的逃跑是否足够。我读过this post,但我仍然不确定我的担忧。
(javascript 使用 OWASP 库进行转义)
【问题讨论】:
' -> &apos;
和 % -> &perc;
(对于 XSS,每个 %34 的编码字符等)
@JoopEggen 在什么情况下将%
替换为&perc;
有用?
@Gumbo &perc;
对于 XSS 确实没那么有用,但它可以混淆 url。浏览器不会为其字符使用 % 代码,即:<a href="%6Aavascript:alert('hi')">
不会调用 javascript。
【参考方案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
,则添加了一个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:更多的上下文存在并且由库支持
【讨论】:
正如我所提到的,我使用 OWASP 来转义 Javascript-Strings。但我有一些遗留代码,由 apache cocoon 生成。这段代码正在按照我的描述进行转义。我的问题是:逃避足够吗?如果没有(并且只有在没有的情况下),我将不得不逐行修改~200 XSL-Stylesheet。 恕我直言,我认为这还不够,仅通过查看此站点(ha.ckers.org/xss.html)您就可以确定您的转义是不够的 @ckuetbach,这能回答你的问题吗? 我觉得我的逃跑应该够了。如 OWASP 所述,对属性和 Javascript 进行转义。只有在纯 HTML 中,我的转义并不像 OWASP 所说的那么难。但是在 ha-ckers.org,如果 被转义,我无法找到任何仅 HTML-Body 的 XSS 女巫。 2014/2015 更新: 我强烈建议将此作为避免 XSS 攻击的参考。这也是 OWASP 的人写的:owasp.org/index.php/…【参考方案2】:我推荐你使用 Appache Common Lang 库来转义字符串,例如转义 HTML:
String escapedString = org.apache.commons.lang.StringEscapeUtils.escapeHtml(String str);
该库有许多有用的方法可以在 HTML、XML、Javascript 中进行转义。
【讨论】:
我不认为 common lang lib 像 ESAPI 那样经过故意恶意输入测试。 其实StringEscapeUtils不会将单引号'
转义成&apos;
,所以不适合HTML转义防止XSS以上是关于HTML-Entity 转义以防止 XSS的主要内容,如果未能解决你的问题,请参考以下文章
[JavaWeb]_[初级]_[对Html特殊符号进行转义防止XSS攻击和反转义]
[JavaWeb]_[初级]_[对Html特殊符号进行转义防止XSS攻击和反转义]
xss 防止攻击,恶意用户将输入的信息当成html或js代码执行,办法是将用户输入的信息改为text格式,或特殊符号转义