springboot 实现布隆过滤器防止黑客攻击

  • Post author:
  • Post category:其他


问题:黑客拿不存在的id请求后端接口,在redis数据库中找不到该id的信息则会去mysql数据库中查询。如果黑客发起大量请求请求数据库是会导致缓存击穿,从而使服务瘫痪。

解决办法:使用布隆过滤器。

在这里插入图片描述

布隆过滤器的优点:

1.简单好用。

2.存储量小,几千万个id可能所占用的内存为几兆到几十兆,如果使用常规的数据库来保存的话可能需要几百G到上T的存储空间。

3.查询速度快。

1.将存在的id放入布隆过滤器中。

2.在通过id查询数据的接口中加入该id是否存在于布隆过滤器中,如果不存在则说明该id在数据库中没有,可不用查询mysql数据库。

static  BloomFilter<String> bloomFilter =BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")),1000,0.001);
    @GetMapping("/bloomFilter")
    @ApiOperation("布隆过滤器")
    public ResponseResult bloomFilter(){
        List<String> allResourceId = resCenterDao.getAllResourceId();
        for (String id : allResourceId) {
                //将所有的资源id放入到布隆过滤器中
            bloomFilter.put(id);
        }
        return new ResponseResult(ResponseEnum.SUCCESS);
    }

使用时只用判断为true即可


    @GetMapping("/bloomFilter/resourceId")
    @ApiOperation("布隆过滤器资源测试")
    public ResponseResult bloomFilterResourceId(@RequestParam("resourceId")String resourceId){
        boolean mightContain = bloomFilter.mightContain(resourceId);
        if (!mightContain){
            return new QueryResult<>(ResCenterEnum.RESOURCE_EXSIT,"");
        }
        return new ResponseResult(ResponseEnum.SUCCESS);
    }

说明:

 List<String> allResourceId = resCenterDao.getAllResourceId();

这一步是从数据库中获取某张表所有的id,那么会存在一个问题,该表的数据会新增,导致布隆过滤器中的id不是最新的。解决办法就是在新增数据,将表的id及时加入到布隆器中。



版权声明:本文为weixin_43748936原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。