如何保证接⼝不被别⼈恶意调⽤
接⼝被恶意调⽤中的恶意指的是不符合后端接⼝设定的调⽤逻辑,⽐如我的验证码接⼝是⽤来给我的注册⽤户发验证码的,每发⼀次我都要付费的,结果有⼈⽤我的接⼝去给⼀些⼿机号发验证码,把我的短信量耗没了,⼀些低级的程序员第⼀反应我⽹站被⿊了,因为他的发送验证码代码都是百度上抄的,能发出去就⾏了,这时候出了问题⼀脸闷逼只能说个⼤概,好⼀点的会意识到是不是我的短信验证码接⼝有问题,排除了不是⾃⼰写的bug外,还是摸不着头绪,再好⼀点的会意识到我的接⼝是不是被恶意调⽤了,但是不知道怎么防。今天给⼤家说⼀下如何保证接⼝不被别⼈恶意调⽤
主页被篡改怎么办看问题要看本质,如果我们抓住了问题的本质,之后这⼀类问题对于我们来说就是⼀个问题,只是表⾯穿了不同的⾐服⽽已
这个问题的本质是什么?⾸先它是如何调⽤我的接⼝的?这个接⼝⽐较特殊,在⽤户注册阶段,也就是这个⽤户的登录态并不在我们后端存储,换句坏说我们不知道这个⽤户的⾝份,意味着这个接⼝不需要⽤户权限就可以调⽤,也就是阿猫阿狗机器⼈脚本都可以过来调,那我写个循环发送接⼝请求的脚本,每秒跑⼀次,发给不同的⼿机,服务端能奈我何,有的⼈这时候会说服务端可以限制请求的频率,这是治标不治本,我可以换IP,或者把循环执⾏时间⼤于你的限制,没⽤的。其实这个被恶意调⽤的本质是篡改了我发送的数据,正常情况我的每次发送都是⼀个有⼿机号的真实⽤户,结果你伪造了⼀个别的⼿
机号⽤户。那么我们的问题实际可以归纳为:如何防⽌数据不被篡改?没错就是签名机制,签名保证了我的数据没有任何⼈可以篡改,除⾮有⼈伪造了我的签名。那我们来看下签名为什么可以做到保护我的数据,做签名⼀般是⽤MD5函数对数据做签名,MD5保证了签名结果不可逆,理论上如果不知道我们的签名算法,是没办法拿到这个签名结果的,这时候有⼈篡改数据的时候,签名结果必然会变化,那服务端通过之前的算法校验签名结果,肯定和传输到后端的是不同的,这样我们可以挡掉这次攻击。我们⽤⼀个简单的签名算法看⼀下这个模式是如何⼯作的
整个情况是这样的
前提要有⼀个key秘钥(这⾥的key客户端和服务端要⼀致)
MD5('⼿机号'+'key') = 签名结果
客户端发送的数据:⼿机号+签名结果
服务端收到数据后计算 MD5('⼿机号'+'key')  是否等于传输过来的签名结果,在不知道签名算法包括key秘钥的情况下是没办法拿到签名结果的,也就是你换了⼿机号没法算出我的签名,也就没法攻击成功了
前⾯我们提到了有⼈会伪造签名,没错客户端这些签名算法包括key都是可以通过某些⽅法拿到的,强
如的客户端签名算法别⼈都能到,知道了这些当然可以伪造签名了,但是我们增加了攻击者的成本,正因为之前攻击我们是0成本的,现在有成本了他要考虑是否划算了,赔本的买卖别⼈是不⼲的,攻击者成本每多⼀层,我们就多⼀层安全。
知道了签名的意义,你就明⽩了为什么android的apk每次都需要签名了,为什么⽀付回调要签名了,说⽩了各种需要签名的地⽅都是因为改动了签名前⾯的数据会对我们造成⾮常⼤的损失