如何在这个 c:out 中避免 XSS?
Posted
技术标签:
【中文标题】如何在这个 c:out 中避免 XSS?【英文标题】:How to avoid XSS in this c:out? 【发布时间】:2013-06-24 17:39:07 【问题描述】:通常我使用 veracode 扫描我的代码更改以检测安全漏洞。现在数据库中有一个字符串,我将其收集在一个名为custFunctionality
的字符串中,以前我在 jsp 中将其显示为:
out.println(<%= custFunctionality %>);
好吧,veracode 扫描了它,让我知道它构成了安全缺陷。
所以我在这里使用c: out
:
<c:out escapexml='false' value='$custFunctionality '/>
现在的问题是该字符串由与 html 相关的标记和我需要在页面中显示的特殊字符组成,如果我不提供 escapexml='false'
这些字符和标记就不会实现。但是,由于代码中有escapexml='false'
字符串,这构成了veracode的安全缺陷,我在重新扫描文件后发现它。
谁能建议我摆脱这个泥潭的替代解决方案?
【问题讨论】:
有什么解决方案吗? “字符串由与 html 相关的标记和特殊字符组成”——您能否澄清一下您是否需要浏览器将它们解释为页面 HTML 的一部分或只是以视觉方式显示给用户? @u2702 : 将在视觉上显示给用户,有时也作为 html 页面的一部分。 【参考方案1】:你要求的是两种不同的东西。获取特殊字符并向用户直观地显示它们是相当简单的。将它们作为标记安全地插入页面更复杂。
视觉展示:
您在这里要做的是将浏览器想要解释的特殊字符作为标记并以一种向浏览器表明它应该只显示的方式对其进行转义(或编码)。 Alex 推荐了 StringEscapeUtils,它应该可以帮助你做到这一点。 (请记住,每个上下文都有自己的转义规则,因此适用于 html 的方法不一定适用于 css 和 javascript。)
标记插入:
在这种情况下,您需要对输入进行一些验证,以确保您没有插入影响页面行为的内容。插入一些 ... 标记可能没问题,插入 javascript 是有风险的。挑战在于捕捉人们可能试图逃避您的过滤器的所有方式。如果您的网站足够有趣,人们会尝试利用此功能。
【讨论】:
以上是关于如何在这个 c:out 中避免 XSS?的主要内容,如果未能解决你的问题,请参考以下文章