diff --git a/build.gradle b/build.gradle index 056ec98cc..e42a2faa7 100644 --- a/build.gradle +++ b/build.gradle @@ -133,6 +133,7 @@ subprojects { compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2' compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.4' //compile group: 'org.apache.commons', name: 'commons-csv', version: '1.7' + compile group: 'org.apache.commons', name: 'commons-text', version: '1.9' compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.6.0' compile group: 'commons-dbutils', name: 'commons-dbutils', version: '1.7' compile group: 'org.apache.commons', name: 'commons-digester3', version: '3.2' diff --git a/config/build_docker.gradle b/config/build_docker.gradle index 8ff89f3da..46219f8ec 100644 --- a/config/build_docker.gradle +++ b/config/build_docker.gradle @@ -133,6 +133,7 @@ subprojects { compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2' compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.4' //compile group: 'org.apache.commons', name: 'commons-csv', version: '1.7' + compile group: 'org.apache.commons', name: 'commons-text', version: '1.9' compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.6.0' compile group: 'commons-dbutils', name: 'commons-dbutils', version: '1.7' compile group: 'org.apache.commons', name: 'commons-digester3', version: '3.2' diff --git a/config/build_jar.gradle b/config/build_jar.gradle index 580afc6b9..50cbad75f 100644 --- a/config/build_jar.gradle +++ b/config/build_jar.gradle @@ -133,6 +133,7 @@ subprojects { compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2' compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.4' //compile group: 'org.apache.commons', name: 'commons-csv', version: '1.7' + compile group: 'org.apache.commons', name: 'commons-text', version: '1.9' compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.6.0' compile group: 'commons-dbutils', name: 'commons-dbutils', version: '1.7' compile group: 'org.apache.commons', name: 'commons-digester3', version: '3.2' diff --git a/config/build_standard.gradle b/config/build_standard.gradle index f30f7fc5a..9bd1ace62 100644 --- a/config/build_standard.gradle +++ b/config/build_standard.gradle @@ -133,6 +133,7 @@ subprojects { compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2' compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.4' //compile group: 'org.apache.commons', name: 'commons-csv', version: '1.7' + compile group: 'org.apache.commons', name: 'commons-text', version: '1.9' compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.6.0' compile group: 'commons-dbutils', name: 'commons-dbutils', version: '1.7' compile group: 'org.apache.commons', name: 'commons-digester3', version: '3.2' diff --git a/maxkey-core/src/main/java/org/maxkey/autoconfigure/MvcAutoConfiguration.java b/maxkey-core/src/main/java/org/maxkey/autoconfigure/MvcAutoConfiguration.java index 128653d27..5345e0d63 100644 --- a/maxkey-core/src/main/java/org/maxkey/autoconfigure/MvcAutoConfiguration.java +++ b/maxkey-core/src/main/java/org/maxkey/autoconfigure/MvcAutoConfiguration.java @@ -25,6 +25,7 @@ import javax.servlet.Filter; import org.maxkey.constants.ConstantsProperties; import org.maxkey.constants.ConstantsTimeInterval; +import org.maxkey.web.WebXssRequestFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -260,6 +261,17 @@ public class MvcAutoConfiguration implements InitializingBean { return new SecurityContextHolderAwareRequestFilter(); } + + @Bean + public FilterRegistrationBean webXssRequestFilter() { + _logger.debug("delegatingFilterProxy init for /* "); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(new WebXssRequestFilter()); + registrationBean.addUrlPatterns("/*"); + registrationBean.setName("webXssRequestFilter"); + registrationBean.setOrder(2); + return registrationBean; + } + @Bean public FilterRegistrationBean delegatingFilterProxy() { _logger.debug("delegatingFilterProxy init for /* "); diff --git a/maxkey-core/src/main/java/org/maxkey/web/WebXssRequestFilter.java b/maxkey-core/src/main/java/org/maxkey/web/WebXssRequestFilter.java new file mode 100644 index 000000000..4813bc15b --- /dev/null +++ b/maxkey-core/src/main/java/org/maxkey/web/WebXssRequestFilter.java @@ -0,0 +1,43 @@ +package org.maxkey.web; + +import java.io.IOException; +import java.util.Enumeration; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import org.apache.commons.text.StringEscapeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.filter.GenericFilterBean; + +public class WebXssRequestFilter extends GenericFilterBean { + + final static Logger _logger = LoggerFactory.getLogger(GenericFilterBean.class); + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + _logger.trace("WebXssRequestFilter"); + boolean isWebXss = false; + Enumeration parameterNames = request.getParameterNames(); + while (parameterNames.hasMoreElements()) { + String key = (String) parameterNames.nextElement(); + String value = request.getParameter(key); + _logger.trace("parameter name "+key +" , value " + value); + if(!StringEscapeUtils.escapeHtml4(value).equals(value) + ||value.toLowerCase().indexOf("script")>-1) { + isWebXss = true; + _logger.error("parameter name "+key +" , value " + value + + ", contains dangerous content ! "); + break; + } + } + if(!isWebXss) { + chain.doFilter(request, response); + } + } + +} diff --git a/maxkey-core/src/test/java/org/maxkey/EscapeHtml4Test.java b/maxkey-core/src/test/java/org/maxkey/EscapeHtml4Test.java new file mode 100644 index 000000000..c37d5da8e --- /dev/null +++ b/maxkey-core/src/test/java/org/maxkey/EscapeHtml4Test.java @@ -0,0 +1,13 @@ +package org.maxkey; + +import java.sql.SQLException; + +import org.apache.commons.text.StringEscapeUtils; + +public class EscapeHtml4Test { + public static void main(String[] args) throws SQLException { + String value=">"; + System.out.println(StringEscapeUtils.escapeHtml4(value)); + System.out.println(StringEscapeUtils.escapeEcmaScript(value)); + } +}