如何在Java应用程序中阻止XSS攻击并阻止用户在网页上执行Java脚本?

How to block XSS attacks in a Java application and prevent users executing JavaScript on the webpage?

在我们的网站上,我们有一个搜索字段,一名安全研究人员告诉我们,这对 XSS 攻击是开放的,因为访问者可能会尝试执行完整的 Java 脚本。他们向我们发送了一个简单示例 URL,它会导致 Java 脚本警告框出现在搜索页面上 - URL 参数是 search?submitted=true&action=search&siteId=2.9945&freeText=1" ;确认(/XSSPOSED/);a="&sort=publishedDate_descending&slotSearch=true

安全研究人员建议所有数据都应通过类似于 PHP 的 htmlentities 的函数传递,同时设置 ent 引号和 UTF8 标志以防止使用混淆进行利用。所以我搜索了看是否有一个 Java 等同于 htmlentities,我从 Apache Commons Lang 的 StringEscapeUtils class 中找到了 escapeHtml() 和 escapeJavaScript() 方法: https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html。 escapeHtml() 方法转义 HTML 个字符,例如 < 和 > 但我不太确定 JavaScript。 escapeJavaScript 方法实际上似乎使用 JavaScript 字符串规则转义字符串中的字符,而不是剥离 JavaScript 本身。

那么,有人知道可以 100% 停止 Java脚本在页面上呈现的解决方案吗?

如果你正在使用 java 并且想在后端验证它,你可以使用这个代码,在这个例子中它检查用户是否没有发送和可疑的价值而不是他的名字。

if (CommonUtility.checkValidate(firstName) || CommonUtility.checkValidate(lastName) ||
 CommonUtility.checkValidate(newUserName)) {
        response
        .sendRedirect(PHConstants.CONTEXT_PATH
            + "/login/registrationError.jsp");
        return;
        }


    public static boolean checkValidate(String name) {
        if (null != name) {
        String patternString = ".*javascript:.*|.*//.*|.*<.*|.*>.*";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(name);
        return matcher.matches();
        }
        return false;
    }

我们可以在服务器端通过添加识别规则来识别被攻击的URL。这是通过在 RuleConf 文件夹

中添加 conf 文件来完成的

供您参考的代码示例:

SecRule REQUEST_LINE "@contains myapp/access/PageServlet?url=/notices/dummyNotifPage.jsp" "chain,phase:2,t:none,status:403,msg:'Generic javascript Injection prevention',severity:2"
SecRule ARGS|QUERY_STRING "(<[^>]*>)" "status:403"
 
SecRule REQUEST_LINE "@contains myapp/access/PageServlet?url=/notices/dummyNotifPage.jsp" "chain,phase:2,t:none,status:403,msg:'Generic javascript Injection prevention',severity:2"
SecRule ARGS|QUERY_STRING "(?i)javascript:" "status:403"
 
SecRule REQUEST_LINE "@contains myapp/access/PageServlet?url=" "chain,phase:2,t:none,status:403,msg:'Check for double slashes in url parameter',severity:2"
SecRule ARGS|QUERY_STRING "/{2}" "status:403"