关于java:HTML-Entity转义防止XSS | 珊瑚贝

HTML-Entity escaping to prevent XSS


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

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

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

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

1
2
& -> &
” ->”

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

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

(JavaScript 使用 OWASP 库进行转义)

  • ‘ -> 和 % -> &perc;(对于 XSS,每 4 个编码字符等)
  • @JoopEggen 在什么情况下将 % 替换为 &perc; 有用?
  • @Gumbo &perc; 对于 XSS 确实没那么有用,但它可以混淆 url。浏览器不为其字符使用 % 代码,即: 不调用 javascript。


我也使用 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: 更多的上下文存在并且被库支持

  • 正如我所提到的,我使用 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/…
  • @PrestonBadeer 是的,我现在正在读这个。我可以问你关于这篇文章的问题吗?它说要转义以下字符。


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

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


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

  • 我不认为公共语言库像 ESAPI 那样经过故意恶意输入测试。
  • 实际上,StringEscapeUtils 不会将单引号 ‘ 转义为 ,因此它不适合 HTML 转义以防止 XSS


来源:https://www.codenong.com/8909613/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?