安全优化
从本篇开始讲秒杀系统的安全优化。主要分为三大块:
- 秒杀接口地址隐藏
- 数学公式验证码
- 接口限流防刷
秒杀接口地址隐藏
每次点击秒杀按钮,才会生成秒杀地址,之前是不知道秒杀地址的。不是写死的,是从服务端获取,动态拼接而成的地址。(Http协议是明文传输,透明的,前端无法控制恶意用户进行攻击)安全校验还是要放在服务端,禁止掉这些恶意服务。
该操作:可以为了防止,恶意用户登陆之后,获取token的情况下,通过不断调用秒杀地址接口,来达到刷单的恶意请求。
每次的url都不一样,只有真正点击秒杀按钮,才会根据商品和用户id生成对应的秒杀接口地址。
但是,这种情况仍然不能解决 利用 按键精灵或者 机器人 频繁点击按钮的操作,为了降低点击按钮的次数,以及高并发下,防止多个用户在同一时间内,并发出大量请求,加入数学公式图形验证码等防高并发优化。
思路:秒杀开始之前,先去请求接口获取秒杀地址。
流程:
- 在用户点击“立即秒杀”时先由前端发出请求到/miaosah/path路径;
- 添加生成地址的接口(/miaosah/path),后台通过UUID和随机值并用MD5加密生成真正的秒杀地址,并且在redis中存入用户id/商品id和秒杀地址的键值对(为了之后的验证使用,Redis的有效期设置为60s,因为跳转到秒杀页面非常快);
- do_miaosha接口改造,带上PathVariable参数,秒杀接口收到请求,先验证PathVariable和缓存中存的是否一致,若一致才进入秒杀环节。
MiaoshaController中改动的相关代码如下:
//第四版,秒杀接口地址隐藏
@RequestMapping(value = "/{path}/do_miaosha", method = RequestMethod.POST)
@ResponseBody
public Result<Integer> miaosha(Model model, @RequestParam("goodsId") long goodsId, HttpServletResponse response,
@CookieValue(value = MiaoshaUserService.COOKI_NAME_TOKEN,required = false) String cookieToken,
@RequestParam(value = MiaoshaUserService.COOKI_NAME_TOKEN,required = false) String paramToken,
@PathVariable("path") String path) {
if (StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
return Result.error