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

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

本文关键字:用户 网页 JavaScript 执行 XSS Java 应用程序 攻击      更新时间:2023-10-14

在我们的网站上,我们有一个搜索字段,一位安全研究人员建议我们,这对XSS漏洞是开放的,因为访问者可以尝试执行完整的JavaScript。他们给我们发了一个简单的URL示例,它会在搜索页面上显示一个JavaScript警报框——URL参数是搜索?提交=真&action=search&siteId=2.9945&freeText=1";确认(/XSPOSED/);a="&sort=publishedDate_descending&slotSearch=真正的

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

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

如果您正在使用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"