开发者社区> 问答> 正文

恶意用假ID高并发get请求攻击导致无法命中缓存而数据库压力过大的防范?? 报错

恶意用假ID高并发get请求攻击导致无法命中缓存而数据库压力过大的防范?? 400 报错

今天面试被问到个有趣的问题,数据库有个表,主键为数字型自增。对外有个get请求例如/item/1,来访问其数据,事先已做过redis缓存,当ID命中缓存时读redis,否则读数据库。

现在问题来了,如果用户用一个不存在的ID发无数请求,例如/item/-1,这样导致缓存无法命中,全部进入数据库搜索,虽然搜不到,但IO压力陡增。

这应该如何防范?
(我是这么回答的,通过定时器定时从数据库里拿到id的上下区间,并缓存起来,每次都把参数ID校验一下,虽然不完美但也能解决90%的吧,但面试官似乎并不满意,感觉他们找到了100%杜绝的方法)

展开
收起
优选2 2020-06-04 21:17:48 945 0
1 条回答
写回答
取消 提交回答
  • Jwt方案能100%解决这种伪造ID恶意访问的情况,但不能解决合法ID恶意请求的情况,这时可以考虑布隆过滤器和令牌桶限流。######布隆过滤器######我们同事也说这个,但我看了下这个并没有解决零错误的问题啊######redis设-1=nodata,失效时间比较短,脏请求也命中######这个我回家也想到了,但万一人家发了无数个不一样的不存在ID呢######封IP呀######还有限流:某接口单位时间只允许有限数量请求。######接口加签名,过滤非法请求######

    看一下布隆过滤器。

    ######这是缓存穿透问题,用一个自定义符存入缓存,下次取缓存先判断,如果为约定符号就知道无需查库了,从而避免压力落入数据库######可以参考json web token,这个是加了签名的,每个请求都要绑定这个token,token不能在客户端更改,其中就包含用户ID,服务端验证签名时也就包括了用户ID,因为这个jwt token中包含的用户ID是由服务器派发的,客户端就算更改了也不能通过服务器验证。######回复 @lxiaod : JWT服务端仅需管理令牌的加密秘钥,无需管理所有令牌,所以这个加密秘钥至关重要,客户端永远不会获得,除非是开发人员泄露或网站遭受黑客攻破。######回复 @lxiaod : 失效时间之类的请参考JWT(Json web Token)方案,我首先也是说建议题主参考JWT方案。######回复 @lxiaod : 既然别人拿到了这个token,则是合法请求,合法请求就应该使用其它限流措施,题主的问题是非法ID的非法请求。######当别人拿到你的token的时候,请求也是可以伪造的,而且如果你的token服务端没有管理的话,token如果没到失效时间,那可以一直用这个token来伪造请求######

    期待好的解决方案

    2020-06-05 11:33:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
徐雷-Java为王,互联网高并发架构设计与选型之路6.0 立即下载
Redis 的高并发实战:抢购系统 立即下载
MySQL高并发场景实战 立即下载