带有动态HTML输入的XSS

时间:2014-10-27 22:40:05

标签: html jsp xss owasp

我的团队正在修复旧jsp应用程序的漏洞威胁。问题是它允许(允许)用户通过将他们的html放入textarea并在页面上呈现它来创建一个简单的主页。问题是xss问题。我一直在做一些研究,发现我可以使用的jsp页面:

fn:来自jstl库的escapeXML()以转义输入的任何html / xml。这对于简单的表单输入很好,但对于主页创建者,我希望能够保留简单的html,但摆脱任何有害的脚本或xss漏洞。

我的队友和我对修复xss问题相当新,并一直依赖我们找到的资源。

我遇到过这些资源,并且在阅读完这些资源后我不确定这是否会按照我喜欢的方式运作。

- Which html sanitization library to use?

- https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

如果我使用owasp,这会将html清理为基本渲染并阻止任何脚本实现吗?

以下是我目前在jsp中的内容:

<td class='caption'>
  <c:set var="x"><%=system.getName()%></c:set>
  Options for ${fn:escapeXml(x)}
</td> 

这有效,并且目前会停止运行任何html / xml /脚本,但我仍然想要一个带有html的简单信息页面的基本html(标题,段落,字体,颜色等)。

1 个答案:

答案 0 :(得分:0)

根据OWASP

  

如果您的应用程序处理标记 - 应该包含HTML的不可信输入 - 则可能非常难以验证。编码也很困难,因为它会破坏应该在输入中的所有标记。因此,您需要一个可以解析和清理HTML格式文本的库。

有不同的HTML sanitizing librariesowasp-java-html-sanitizer library可能是个不错的选择。

您可以使用prepackaged policies

PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
String safeHTML = policy.sanitize(untrustedHTML);

配置您的own policy

PolicyFactory policy = new HtmlPolicyBuilder()
   .allowElements("a")
   .allowUrlProtocols("https")
   .allowAttributes("href").onElements("a")
   .requireRelNofollowOnLinks()
   .build();
String safeHTML = policy.sanitize(untrustedHTML);

或写custom policies

PolicyFactory policy = new HtmlPolicyBuilder()
    .allowElements("p")
    .allowElements(
        new ElementPolicy() {
          public String apply(String elementName, List<String> attrs) {
            attrs.add("class");
            attrs.add("header-" + elementName);
            return "div";
          }
        }, "h1", "h2", "h3", "h4", "h5", "h6"))
    .build();
String safeHTML = policy.sanitize(untrustedHTML); 

阅读documentation了解详情。