0

我正在开发一个 jsp/servlet 应用程序,现在的要求是应用跨站点脚本,因为它是一个包含大约 200 个 jsp 页面的巨大应用程序,并且需要对每个 jsp 页面进行编码,所以我正在寻找一个有效的方法来做到这一点,从而减少工作量,比如我们可以在 Servlet 过滤器中做到这一点,或者一个好的框架来实现这一点。

任何帮助,将不胜感激。

4

1 回答 1

0

我有同样的问题。我们有很多 jsp 页面(超过 10000 个页面,非常庞大的项目),因此您知道当您执行以下操作时可能会发生 XSS 攻击漏洞:

<div><%=someValue%></div>

所以我们这里有两个选择:

1)使用<c:out>来自 jsp 的标签来确保我们不会发生 XSS 攻击。像这样的东西:

<div><c:out value="<%=someValue%>" /></div>

将其应用于所有 200 页并不难。

2)编写一些java代码来检查该值是否具有XSS volnerability。您可能会someValue从这样的 Java 类中获得:

String someValue = MyClass.getSomeValue();

所以在getSomeValue方法中你应该检查一些模式。

我为 XSS 检测编写了一些 Java 模式,并在这里为您提供:

private static Pattern[] patterns = new Pattern[]{
        // Script fragments
        Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE),
        // src='...'
        Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        // lonely script tags
        Pattern.compile("</script>", Pattern.CASE_INSENSITIVE),
        Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        // eval(...)
        Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        // expression(...)
        Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        // javascript:...
        Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE),
        // vbscript:...
        Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE),
        // onload(...)=...
        Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL)
};

public static Boolean strongCheckForXSS(String input) {
    if (input == null)
        return false;
    for (Pattern p : patterns)
        if (p.matcher(input).find())
            return true;
    return false;
}
于 2019-11-13T08:39:49.073 回答