当JSTL escapeXml为false时,如何防止JavaScript注入(XSS)

par*_*oir 0 javascript xss jsp jstl

我有一个人们可以添加他们的东西的表格.但是,在这种形式中,如果他们输入JavaScript而不是文本,他们可以轻松地注入他们想做的任何事情.为了防止它,我可以将escapeXml设置为true,但是普通的HTML也会被转义.

<td><c:out value="${item.textValue}" escapeXml="true" /></td>
Run Code Online (Sandbox Code Playgroud)

有没有其他方法来阻止JavaScript注入而不是将其设置为true?

Bal*_*usC 7

我建议使用Jsoup.以下是其网站的相关摘录.

清理不受信任的HTML

问题

您希望允许不受信任的用户为您网站上的输出提供HTML(例如,作为评论提交).您需要清理此HTML以避免跨站点脚本(XSS)攻击.

将jsoup HTML Cleaner与a指定的配置一起使用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>
Run Code Online (Sandbox Code Playgroud)

因此,在处理提交的文本时,您基本上需要做的就是以下内容:

String text = request.getParameter("text");
String safe = Jsoup.clean(text, Whitelist.basic());
// Persist 'safe' in DB instead.
Run Code Online (Sandbox Code Playgroud)

Jsoup也提供了更多的优势.另请参阅Java中HTML解析器的优缺点.