seckill icon indicating copy to clipboard operation
seckill copied to clipboard

请问隐藏秒杀接口是为什么呀?

Open HuangtianyuCN opened this issue 5 years ago • 2 comments

我有点想不明白这个逻辑。 隐藏秒杀接口如果是为了防刷,为什么不直接用验证码呢? 如果是为了安全,那它的安全具体体现在哪里呢?

HuangtianyuCN avatar Jul 04 '19 00:07 HuangtianyuCN

如果在客户端通过图像识别等技术获取到验证码,可以自动的将验证码填充到post请求体中,循环发起请求,试想,如果每个用户都这样做,请求量将会非常巨大,服务端撑不住。所以单单使用验证码无法做到防刷。 为了防止上述情形的发生,需要对接口隐藏和对接口限流。对接口隐藏,让用户在使用上述手段发请求时不会真正做秒杀,只会发送无用的请求到服务端;其次,接口限流是为了防止用户发起过于频繁的秒杀请求(也有可能是机器手段发出的秒杀请求),减轻服务器压力。 另外,防刷是因,安全是果。

Grootzz avatar Aug 23 '19 05:08 Grootzz

程序的逻辑是如下的: 1.首先用户在getMiaoshaPath中,如果判断验证码是正确的,那么就会创建一个秒杀路径,也就是说,只要在getMiaoshaPath中,每次判断验证码正确都会创建秒杀路径。 2.然后用户获得返回的秒杀路径后,会通过秒杀路径执行do_miaosha_static方法。这个方法中先判断path是否正确,然后减库存,异步生成订单。 那么问题来了。 如果说——对接口隐藏是为了防止用户图像识别出验证码循环刷接口,那么: 1.验证码能被图像识别,是验证码的问题,削峰没做好。 2.在削峰没做好的基础上,每个用户先执行getMiaoshaPath获得路径,且每次获取都会刷新一遍redis中的path,然后通过服务器返回的path去调用do_miaosha_static,应该无法做到你说的“只会发送无用的请求到服务端”。这些请求明明就是有效的啊。 3. 限流我是理解的,主要就是防暴露接口这边,我想了很久都理解不了。可以说验证码技术是为了防刷和削峰,但是防止接口暴露我认为只能防止有人提前拿到接口然后用工具去刷。反正在秒杀开始后,服务器都会返回秒杀地址的,那么,只要有人想刷,无非就是先从服务器获得秒杀地址,再根据秒杀地址秒杀而已。 4.如果可以的话,希望您能具体说一下“只会发送无用的请求”的意思,我认为发送的请求不是无效的,是会正常走流程的。

HuangtianyuCN avatar Aug 23 '19 13:08 HuangtianyuCN