我有一个人们可以添加他们的东西的表格。但是,在这种形式中,如果他们输入JavaScript而不是文本,他们可以轻松地注入他们想做的任何事情。为了防止它,我可以将escapeXml设置为true,但是普通的HTML也会被转义。
<td><c:out value="${item.textValue}" escapeXml="true" /></td>
有没有其他方法可以阻止JavaScript注入,而不是将其设置为true?
答案 0 :(得分:7)
Sanitize untrusted HTML
问题
您希望允许不受信任的用户为您网站上的输出提供HTML(例如,作为评论提交)。您需要清除此HTML以避免cross-site scripting(XSS)攻击。
解决方案
将jsoup HTML
Cleaner
与Whitelist
指定的配置一起使用。String unsafe = "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>"; String safe = Jsoup.clean(unsafe, Whitelist.basic()); // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>
因此,在处理提交的文本时,您基本上需要做的就是以下内容:
String text = request.getParameter("text");
String safe = Jsoup.clean(text, Whitelist.basic());
// Persist 'safe' in DB instead.
Jsoup也提供了更多的优势。另请参阅Pros and Cons of HTML parsers in Java。
答案 1 :(得分:2)
您需要将服务器上的HTML文本解析为XML,然后抛弃任何不在严格白名单中的标记和属性。
(并查看href
和src
属性中的网址)
答案 2 :(得分:1)
这正是OWASP AntiSamy project的意图。
OWASP AntiSamy项目是一些事情。从技术上讲,它是一个API,用于确保用户提供的HTML / CSS符合应用程序的规则。另一种说法可能是:它是一种API,可以帮助您确保客户端不会在他们为其配置文件,评论等提供的HTML中提供恶意货物代码,这些代码会持久存储在服务器上。关于Web应用程序的术语“恶意代码”通常表示“JavaScript”。层叠样式表在调用JavaScript引擎时仅被视为恶意。但是,在许多情况下,可以以恶意方式使用“普通”HTML和CSS。所以我们也照顾好了。
另一个替代方案是OWASP HTMLSanitizer项目。它更快,具有更少的依赖性,并且在项目主管方面得到了积极的支持。我认为它还没有通过任何GA / Stable版本,所以在评估这个库时你应该考虑它。