今天码着码着代码突然想起,当年公司被人恶意攻击抓取注册发送验证码的接口,然后他随机生成电话号一直刷我们的短信功能,导致我们损失了不少短信费。
今天捋了捋思路,记录一下(跟我们当年的处理方法不太一样,因为我们验证码的生成方式和正常的不一样)。
思路:
前期准备,前台和后台要商量好一个盐值将它与随机字符串拼接后md5加密,用来进行校验。
什么是盐值:就是一个字符串,用来混淆原字符串。
举例:生成的随机字符串为"123456",经过md5加密后为"E10ADC3949BA59ABBE56E057F20F883E",
如果黑客截获到你的随机字符串为"123456",那么他直接用md5加密就能试出来加密后的值,但是加上“盐值”,这里我们盐值用"abc"(前台和后台商量好的字符串,这个字符串要在客户端和服务器分别存一份)拼接后就为"123456abc",md5加密后字符串为"DF10EF8509DC176D733D59549E7DBFAF",这样黑客即使得到了"123456",但是他不知道我们盐值"abc",所以他无法模拟客户端向服务器发送请求。
1.客户端:发送手机号到服务器。
2.服务器:①生成验证码;②生成随机字符串;③随机字符串拼接盐值后md5加密;④将第一步的验证码和第三步加密后的字符串存到数据库中;⑤将第二步生成的随机字符串返回给客户端。
3.客户端:在成功回调中拿到随机字符串,将随机字符串拼接盐值并md5加密,然后拿手机号和加密后的字符串请求服务器。
4.服务器:接到数据后,找到手机号对应的数据,取出刚才存储的加密后的字符串与客户端发送过来的加密字符串进行对比,正确,取出验证码发送并清空刚才存储的这条记录(成功发出短信后一定要把这条记录清空,这样再次过来异常数据就无法进行对比了必然返回错误);错误,返回个炸弹。
整体思路就是上面这样,如果有什么BUG请指出。