欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【商城秒杀项目】-- 秒杀接口地址隐藏

程序员文章站 2022-05-11 15:01:51
...

每次点击秒杀按钮的时候,才生成秒杀地址,秒杀地址不是写死的,而是从服务端获取,动态拼接而成的地址(HTTP协议是明文传输,前端是防不住恶意用户的攻击,所以安全校验要放在服务端,从而禁止掉这些恶意攻击),本篇博客记录如何进行秒杀接口地址隐藏进行安全优化

实现思路:

在进行秒杀之前,先去后端获取一个动态的秒杀地址path(由后端生成随机字符串作为path),然后将这个随机字符串返回给前端,前端将这个字符串拼接成新的URL(url : “/miaosha/” + path + “/do_miaosha”)作为秒杀地址,再发请求到后端开始秒杀

前端代码逻辑如下:

【商城秒杀项目】-- 秒杀接口地址隐藏

【商城秒杀项目】-- 秒杀接口地址隐藏

获取随机字符串的接口代码:

/**
 * 获取秒杀的path,并且验证验证码的值是否正确
 * 加入注解,实现拦截功能,进而实现限流功能
 */
@AccessLimit(seconds = 5, maxCount = 5, needLogin = true)
@RequestMapping(value = "/path", method = RequestMethod.GET)
@ResponseBody
public Result<String> getMiaoshaPath(MiaoshaUser user,
                                     @RequestParam("goodsId") long goodsId,
                                     @RequestParam(value = "verifyCode", defaultValue = "0") int verifyCode) {
    if (user == null) {
        return Result.error(CodeMsg.SESSION_ERROR);
    }
    boolean check = miaoshaService.checkVerifyCode(user, goodsId, verifyCode);
    if (!check) {
        return Result.error(CodeMsg.REQUEST_ILLEGAL);
    }
    String path = miaoshaService.createMiaoshaPath(user, goodsId);
    return Result.success(path);
}

createMiaoshaPath方法代码(生成随机数并加密作为path,并且存入缓存(设置缓存过期时间60s),然后将这个随机字符串返回给前端):

/**
 * 创建一个临时的秒杀地址
 */
public String createMiaoshaPath(MiaoshaUser user, long goodsId) {
    if (user == null || goodsId <= 0) {
        return null;
    }
    String str = MD5Util.md5(UUIDUtil.uuid() + "123456");
    //将生成的随机字符串保存到redis
    redisService.set(MiaoshaKey.getMiaoshaPath, "" + user.getId() + "_" + goodsId, str);
    return str;
}

保存到redis里的path如下:

【商城秒杀项目】-- 秒杀接口地址隐藏

然后在秒杀之前对path进行验证:

【商城秒杀项目】-- 秒杀接口地址隐藏

checkPath方法代码(将前端传来的path与缓存中的path进行比较,如果一致,则可以进行下面的秒杀逻辑,否则,是非法请求):

/**
 * 验证秒杀地址
 * @param user
 * @param goodsId
 * @param path
 * @return
 */
public boolean checkPath(MiaoshaUser user, long goodsId, String path) {
    if (user == null || path == null) {
        return false;
    }
    String pathOld = redisService.get(MiaoshaKey.getMiaoshaPath, "" + user.getId() + "_" + goodsId, String.class);
    return path.equals(pathOld);
}

加上了秒杀接口地址隐藏之后可以防止恶意用户登陆之后,通过不断调用秒杀地址接口来骚扰服务器,所以要动态获取秒杀地址,只有真正点击秒杀按钮,才会根据用户id和商品id生成对应的秒杀接口地址

但是,这种情况仍然不能解决利用机器人频繁点击按钮的操作,为了降低点击按钮的次数,以及高并发下,防止多个用户在同一时间内,并发出大量请求,还需加入数学公式图形验证码以及接口防刷等优化技术