恶意用假ID高并发get请求攻击导致无法命中缓存而数据库压力过大的防范?? 400 报错
今天面试被问到个有趣的问题,数据库有个表,主键为数字型自增。对外有个get请求例如/item/1,来访问其数据,事先已做过redis缓存,当ID命中缓存时读redis,否则读数据库。
现在问题来了,如果用户用一个不存在的ID发无数请求,例如/item/-1,这样导致缓存无法命中,全部进入数据库搜索,虽然搜不到,但IO压力陡增。
这应该如何防范?
(我是这么回答的,通过定时器定时从数据库里拿到id的上下区间,并缓存起来,每次都把参数ID校验一下,虽然不完美但也能解决90%的吧,但面试官似乎并不满意,感觉他们找到了100%杜绝的方法)
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来伪造请求######期待好的解决方案
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。