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

时间:2016-03-31 08:45:22

标签: javascript java tomcat xss

在我们的网站上,我们有一个搜索字段,安全研究人员告诉我们,这对XSS漏洞是开放的,因为访问者可能会尝试执行完整的JavaScript。他们向我们发送了一个简单的示例网址,导致JavaScript警告框出现在“搜索”页面上 - 网址参数为搜索?提交= true& action = search& siteId = 2.9945& freeText = 1“;确认(/ XSSPOSED /) ; A =“&安培;排序= publishedDate_descending&安培; slotSearch =真

安全研究人员建议所有数据都应该通过类似于PHP的htmlentities的函数传递,同时引用和引用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方法实际上似乎是使用JavaScript String规则转义字符串中的字符,而不是剥离JavaScript本身。

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

1 个答案:

答案 0 :(得分:0)

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