springMVC implements Filter to prevent xss injection

Cross-site scripting tool (cross-site scripting), in order not to be confused with the abbreviation of cascading style sheets (CSS), so the cross-site scripting attack is abbreviated as XSS. A malicious attacker inserts malicious scriptScript code into a web page. When a user browses the page, the script code embedded in the web page will be executed, thereby achieving the purpose of maliciously attacking the user. The simple prevention of preventing XSS attacks is to remove some sensitive script commands from some parameters in the Request request.

It was originally intended to be implemented through the HandlerInterceptor mechanism of springMVC. By obtaining the request and then modifying the parameters in the request, although the value has been modified, the value obtained in the Controller has not been modified. No way is to filter to complete. Simply put, it is to create a new httpRequest class XsslHttpServletRequestWrapper, and then rewrite some get methods (XSS judgment and prevention of parameters when getting parameters).

    @WebFilter(filterName="xssMyfilter",urlPatterns="/*")   
    public class MyXssFilter implements Filter{  

        @Override  
        public void init(FilterConfig filterConfig) throws ServletException {  

        }  

        @Override  
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
                throws IOException, ServletException {  
            XsslHttpServletRequestWrapper xssRequest = new XsslHttpServletRequestWrapper((HttpServletRequest)request);  
            chain.doFilter(xssRequest , response);   
        }  

        @Override  
        public void destroy() {  

        }  

    }  

The filtering of XSS code is implemented in XsslHttpServletRequestWrapper, mainly by overriding the methods of getParameter, getParameterValues, and getHeader, and then performing XSS processing on the obtained value.

    public class XsslHttpServletRequestWrapper extends HttpServletRequestWrapper {  

         HttpServletRequest xssRequest = null;    

        public XsslHttpServletRequestWrapper(HttpServletRequest request) {  
            super(request);  
            xssRequest = request;  
        }  


         @Override    
         public String getParameter(String name) {    
              String value = super.getParameter(replaceXSS(name));    
                if (value != null) {    
                    value = replaceXSS(value);    
                }    
                return value;    
         }    

         @Override  
        public String[] getParameterValues(String name) {  
             String[] values = super.getParameterValues(replaceXSS(name));  
             if(values != null && values.length > 0){  
                 for(int i =0; i< values.length ;i++){  
                     values[i] = replaceXSS(values[i]);  
                 }  
             }  
            return values;  
         }  

         @Override    
         public String getHeader(String name) {    

                String value = super.getHeader(replaceXSS(name));    
                if (value != null) {    
                    value = replaceXSS(value);    
                }    
                return value;    
            }   
         /** 
          * 去除待带script、src的语句,转义替换后的value值 
          */  
        public static String replaceXSS(String value) {  
            if (value != null) {  
                try{  
                    value = value.replace("+","%2B");   //'+' replace to '%2B'  
                    value = URLDecoder.decode(value, "utf-8");  
                }catch(UnsupportedEncodingException e){  
                }catch(IllegalArgumentException e){  
            }  

                // Avoid null characters  
                value = value.replaceAll("\0", "");  

                // Avoid anything between script tags  
                Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);  
                value = scriptPattern.matcher(value).replaceAll("");  

                // Avoid anything in a src='...' type of e­xpression  
                scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  

                scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  

                // Remove any lonesome </script> tag  
                scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);  
                value = scriptPattern.matcher(value).replaceAll("");  

                // Remove any lonesome <script ...> tag  
                scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  

                // Avoid eval(...) e­xpressions  
                scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  

                // Avoid e­xpression(...) e­xpressions  
                scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  

                // Avoid javascript:... e­xpressions  
                scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Avoid alert:... e­xpressions  
                scriptPattern = Pattern.compile("alert", Pattern.CASE_INSENSITIVE);  
                value = scriptPattern.matcher(value).replaceAll("");  
                // Avoid onload= e­xpressions  
                scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
                value = scriptPattern.matcher(value).replaceAll("");  
                scriptPattern = Pattern.compile("vbscript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);    
                value = scriptPattern.matcher(value).replaceAll("");  
            }             
            return filter(value);  
        }  

            /** 
             * 过滤特殊字符 
             */  
            public static String filter(String value) {  
                if (value == null) {  
                    return null;  
                }          
                StringBuffer result = new StringBuffer(value.length());  
                for (int i=0; i<value.length(); ++i) {  
                    switch (value.charAt(i)) {  
                        case '<':  
                            result.append("<");  
                            break;  
                        case '>':   
                            result.append(">");  
                            break;  
                        case '"':   
                            result.append(""");  
                            break;  
                        case '\'':   
                            result.append("'");  
                            break;  
                        case '%':   
                            result.append("%");  
                            break;  
                        case ';':   
                            result.append(";");  
                            break;  
                        case '(':   
                            result.append("(");  
                            break;  
                        case ')':   
                            result.append(")");  
                            break;  
                        case '&':   
                            result.append("&");  
                            break;  
                        case '+':  
                            result.append("+");  
                            break;  
                        default:  
                            result.append(value.charAt(i));  
                            break;  
                    }    
                }  
                return result.toString();  
            }  

    }  

Reprinted: https://blog.csdn.net/qq924862077/article/details/62053577

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324521955&siteId=291194637