HTML-Entity escaping to prevent XSS
我有一些用户输入。在我的代码中,我确保以下符号被转义:
OWASP 声明有更多的字符需要转义。
对于属性,我做了另一种转义:
这确保所有属性都被"包围。这让我确定我的 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