使用过滤器过滤请求参数中的敏感信息

上节已经介绍了过滤器的使用方法,现在我们来看下实际场景中,如何使用过滤器过滤请求的参数中的敏感信息,主要针对get、post两种请求方式过滤。

1. get请求参数过滤

get请求,可以从request中拿到请求参数,看参数中是否包含敏感信息,假设敏感信息是"傻瓜"

HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        boolean flag = true;
        String badInfo = "傻瓜";
        if (httpServletRequest.getMethod().equals(RequestMethod.GET.name())) {
            Map<String, String[]> parameterMap = httpServletRequest.getParameterMap();
            if (!MapUtils.isEmpty(parameterMap)) {
                flag =!parameterMap.entrySet().stream().anyMatch(entry -> Arrays.toString(entry.getValue()).contains(badInfo));
                if (!flag) {
                    servletResponse.setContentType("application/json; charset=UTF-8");
                    PrintWriter out = servletResponse.getWriter();
                    ResultResponse resultResponse = new ResultResponse();
                    out.println(JSON.toJSONString(ResultResponse.fail("-9999", "参数包含敏感信息")));
                    out.flush();
                } else {
                    filterChain.doFilter(servletRequest, servletResponse);
                }
            } else {
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }

测试,访问一个get接口,参数为"笨蛋",结果如下

2. post请求参数过滤

post请求参数就不能直接获取了,要通过输入流InputStream获取,但是这里有一个坑

public String getParm(HttpServletRequest request) {
    BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
    } catch (IOException e) {
    }
    String line = null;
    StringBuilder sb = new StringBuilder();
    try {
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
    } catch (IOException e) {
    }
    return sb.toString();
}

这个方法就是从post请求中获取参数,参数可以正常获取,但是访问却会报错

错误说缺少请求体,但是我们明明有传参,可知从InputStream获取参数只能获取一次,因为InputStream内部有个pos指针,指向下次要读取的起始位置,由于已经读取了一次,指针位置已指向末端,ServletInputStream没有重写reset方法,无法重置pos指针指向位置,所以当读取完后将无法继续读取

因此我们可以请求参数以byte[]形式存起来,新建class继承HttpServletRequestWrapper

public class RequestWrapper extends HttpServletRequestWrapper {
    private String body;
    public RequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
            InputStream inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ex) {
                    throw ex;
                }
            }
        }
        body = stringBuilder.toString();
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        ServletInputStream servletInputStream = new ServletInputStream() {
            public boolean isFinished() {
                return false;
            }
            public boolean isReady() {
                return false;
            }
            public void setReadListener(ReadListener readListener) {}
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }
        };
        return servletInputStream;

    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream(),"UTF-8"));
    }
    public String getBody() {
        return this.body;
    }
}

过滤器的doFilter方法如下

} else if (httpServletRequest.getMethod().equals(RequestMethod.POST.name())) {
            RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);
            if(requestWrapper == null) {
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                String body = requestWrapper.getBody();
                flag = !body.contains(badInfo);
                if (!flag) {
                    servletResponse.setContentType("application/json; charset=UTF-8");
                    PrintWriter out = servletResponse.getWriter();
                    ResultResponse resultResponse = new ResultResponse();
                    out.println(JSON.toJSONString(ResultResponse.fail("-9999"
                            , "参数包含敏感信息")));
                    out.flush();
                } else {
                    filterChain.doFilter(requestWrapper, servletResponse);
                }
            }
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }

访问一个post接口,包含敏感信息’笨蛋’

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
##KodExplorer (http://kalcaddle.com/) ###ver2.61(2014.7.12) `商业版授权请联系:kalcaddle#qq.com` #### 1.是什么: - Kodexplorer为千帆网络工作室开发的一款服务器文件管理程序。 - 完美取代FTP管理:可用于服务器文件管理,zip解压缩 备份还原、支持图片、音乐、视频预览、office、pdf等格式在线预览。文件夹拖拽上传……。 - 在线编程:支持几乎所有编程语言的在线编辑(高亮,多光标编辑.堪比本地的sublime) - 极佳的操作体验:及其便捷的快捷键支持,让你拥有本地化的体验 - 文等多语言支持:文编码全面兼容,文件编辑自动适配。 - 超快的速度:全面采用Ajax+Json进行数据通信,毫秒级的响应速度; - 全平台兼容性:Win Linux Mac (Apache、Nginx、IIS) #### 2.使用场景: - 取代FTP,服务端、客户端软件等复杂的安装配置。kod可以一键安装随处使用. - 你可以用它来管理你的服务器(备份,在线解压缩,版本发布....) - 你可以把他当做管理linux的一个操作系统界面 - 可以用来作为私有云存储系统,存储你的文件... - 当然你也可以用来分享文件 - Web IDE / browser code editor awesomeness - 更多场景等你来挖掘!…… #### 3.使用说明 管理员: admin/admin 普通用户:demo/demo 游客用户:guest/guest [如何使用] 下载程序,解压上传到你的服务器路径下,data目录设置777权限。访问体验超便捷的服务吧! (data目录没有写权限会导致配置修改不能保存、不能新建用户等) [关于上传问题] 程序没有做任何限制,如果需要上传大文件,则修改 php.ini:`upload_max_filesize = 1000M post_max_size = 1000M` [关于解压缩问题] 程序不做任何限制,如若失败请设置php内存限制。memory_limit 1000M [关于兼容性] 建议使用chrome firefox ie9+ 体验更完整。ie8以下基本上不做兼容处理。chrome支持文件夹拖拽上传。 [文件打开] office文件在线预览功能,服务器必须在公网(外部能访问该服务器) [忘记密码] 修改data/system/member.php 密码为明文的md5值 例如将admin密码重设为admin 则修改第一行:"name":"admin","password":"21232f297a57a5a743894a0e4a801fc3" ![](https://cloud.githubusercontent.com/assets/3761968/2583304/764f562a-b9cf-11e3-8e59-afdbdffc20eb.png) ###ver2.61 `2014/7/12` ---- ####update: - 实时搜索,根据搜索框内容变化,实时选匹配到的结果; - 弹出搜索框遍历子文件夹递归搜索 - session key 加入kod_前缀 避免和其他系统key冲突 - 编辑器选优化 选择鼠标到窗口外事件处理 ####fix bug:(bug解决和程序优化) - backspace后退截获浏览器事件,作为后退前一次访问的文件夹; - 搜索首字母不匹配问题 - 弹出层的弹出层关闭,父窗口失去焦点问题。 - 代码grunt部分代码拆分开,放到程序外面;提交到git、osc - 桌面:删除alert enter快捷键删除 - install 检测 加入跳过,(只判断用到的函数) 加入多语言 - zip压缩没有权限 提示红色,false 统一查找 - 登录成功后 验证码输错清除 - 非root用户拖拽到文件夹问题 - 非root解压问题 不能解压 - list oexe 图标问题 - 用户目录不存在判断 - fileCahe 互斥锁 reset 不用 - ie 8~10样式问题调整 ###ver2.6 `2014/7/6` ---- ####update: - 完全性优化;加入严格的校验机制 - 首次运行环境检测[data目录检测,必须的函数支持提示] - 上传已存在处理——创建副本(另外包括粘贴,解压) - 选优化 ctrl选拖拽 - 键盘快捷键选文件,多个字符
SpringBoot过滤器使用场景可以是以下几个方面: 1. 权限控制:可以在过滤器进行用户身份验证和权限验证,以确保只有具有特定权限的用户才能访问某些资源。例如,可以使用过滤器来拦截需要登录的请求,并检查用户是否已登录,如果未登录,则重定向到登录页面。 2. 请求日志记录:过滤器可以用于记录请求的详细信息,如请求的URL、请求参数请求的方法等。这对于分析和排查问题非常有用。可以在过滤器将这些信息写入日志文件或发送到监控系统。 3. 请求头处理:过滤器可以对请求头进行处理,例如添加或删除某些请求头。这在需要在请求添加特定的头信息或删除某些敏感信息时非常有用。 4. 请求/响应数据处理:过滤器可以对请求和响应的数据进行处理。例如,可以在过滤器请求参数进行解密或加密,对响应的数据进行压缩或加密。 5. 异常处理:过滤器可以用于捕获和处理请求处理过程发生的异常。可以在过滤器对异常进行记录、处理或返回自定义的错误信息。 总的来说,SpringBoot过滤器可以在请求到达目标资源之前或之后进行一些处理操作,如权限验证、请求日志记录、请求头处理、数据处理和异常处理等。这使得过滤器在Web应用程序具有广泛的使用场景,可以帮助我们实现一些通用的功能和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值