viaco2love 2022-04-22 18:11 采纳率: 66.7%
浏览 25
已结题

网页被测出xss 漏洞,常态处理已经用上了,没有说为什么有xss. 只说有xss. 请问怎么处理呢?

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容

img

我的解答思路和尝试过的方法

所有访问输入进行限制了。只能输人限定字符【1-9】【a-z】[A-Z] [中文],其他全部不给发送,然后还要限定一些英文单词不能发送
弄个验证码。输入才能访问页面
url参数也限制死
最后方案:删掉这个页面

我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 吕布辕门 后端领域新星创作者 2022-04-22 18:44
    关注

    添加拦截器进行过滤处理,需要去除一些脚本字符如script,望采纳!

    
    
    import java.io.IOException;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.filter.OncePerRequestFilter;
    
    /**
     * @author Wu,Yang
     * @version 2011-4-20toWarningPage
     */
    public class XssFilter extends OncePerRequestFilter {
    
        @Override
        public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
                throws ServletException, IOException {
            response.addHeader("x-frame-options", "SAMEORIGIN");
            response.addHeader("X-XSS-Protection", "1; mode=block");
            response.addHeader("X-Content-Type-Options", "nosniff;");
            response.addHeader("Strict-Transport-Security", "max-age=31536000; includeSubdomains;");
    
            Cookie[] cookies = request.getCookies();
            if(cookies != null) {
                response.setHeader("Set-Cookie", "JSESSIONID="+  request.getSession().getId()+"; Secure;HttpOnly;");
            }
            chain.doFilter(new XssHttpServletRequestWrapper1((HttpServletRequest) request), response);
        }
    
    }
    
    
    
    
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.util.regex.Pattern;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    
    public class XssHttpServletRequestWrapper1 extends HttpServletRequestWrapper {
    
        HttpServletRequest xssRequest = null;
    
        public XssHttpServletRequestWrapper1(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("");
                if(scriptPattern.matcher(value).find()){
                    value ="";//再次匹配到,避免出现内嵌
                }
    
                // 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();
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月25日
  • 已采纳回答 5月17日
  • 创建了问题 4月22日

悬赏问题

  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 如何提取csv文件中需要的列,将其整合为一篇完整文档,并进行jieba分词(语言-python)
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题