#如何验证请求的唯一性# ##前言## 讲到请求的唯一性,是我在接口API中开发中遇到的一个问题,有一个需求就当当你的链接被捕获之后如何让它失效,当然是在别人没有破解规则之前!如果别人截取了你的请求可以进行大量请求攻击(防止重复请求攻击(RepeatAttack))而且会跑到逻辑层并不会在拦截器中拦截,我们要做的就是在拦截器避免这种情况,当然实现的方式有很多种
ps:当然是防御不了内容被篡改但是在后面的文章我会减少一种我现在在使用的一套结合起来的请求安全方面来最大可能的避免此类问题
##1.浅谈各项解决方案## ###1.1微信### 微信分为主动请求(比如一个用户向公众号发送了消息要返回什么类容,可以指向专门的自定程序)和接受请求(如微信推送,点对点推送,客服,提醒)
第一种:主动请求
主动请求微信是会有一个机制,绑定URL(服务器地址)绑定服务器地址的话,如果别人不是侵入了你的服务器或者是改变了这个地址的指向基本
很难操作的余地
第二种:接受请求
对于接受的请求来说微信并没有限定必须是摸个特定地址的请求,也就是说任何一台机器都可以请求微信,微信也需要处于安全考虑,别人捕获了
一个推送微信的请求可以不停的访问,这样就可能导致服务器资源被占用正常的用户无法使用或响应时间长(不过对于这种大公司应付这种攻击
的能力是很强的,当然对于小公司来说就不同了,资源有限的情况下最好是可以避免这种拦截请求频繁访问的攻击-攻击也就是所谓的DdoS攻击)
微信几套方式来防止这种问题
1.使用公众号的access_token获取服务器的IP地址列表
2.有效时常access_token用一些凭证获取,在所有的请求都会验证,而且会有失效时间,每天获取的access_token也是有限的
3.所有的被请求的接口都会有对于每个用户次数限制
综合以上基本上就是一个堡垒了,一必须通过服务器验证用户有效性(相当于登录),然后获取动态服务器地址,然后是请求频率限制
但是对于实现实现起来局限比较多,成本相当高也比较复杂.
###1.2大众点评### 大众点评是提供了一套"商家接入层接口"这套接口时提供给服务器与服务器通讯的这点和微信不同 只有一种接受请求
大众点评并没有采用对于请求唯一性的验证,因为是服务器之间的通讯基本可以理解
但是他也使用了一些方法通讯安全的处理方法
1.appKey请求开发者作为请求加解密的参数
2.点评提供给您的开发者token
相对于微信来说点评的这个安全性也许看起来小了很多,但是这是对于服务器与服务器对接的本身内部的安全级别就比较高
##2.一个简单的解决方案介绍## 我推荐的这个方式比较适合,不想花太大成本,又想得到比较好的安全效果人群使用
当然请求唯一性是对于一个用户(在微信里面是appid,在点评里面是appKey)这个都是用户的唯一标示
在这个简单的解决方案中有两个比较重要的东西,随机数,时间戳,通过这两个东西加上用户唯一标示就能实现一套简单的请求唯一性验证
还是一句老话:如何实现是最后一个问题
在这里我还是采用redis键值存储,并且约定除了登录外的所有接口请求是都需带用户唯一标示,所有请求都必须有客户端生成的随机数,时间戳
###2.1用户请求登录接口需要做的操作: 1.通过用户的用户名密码或者一些其他东西获取用户的唯一标示 2.把用户的唯一标示作为key随机数和时间戳作为value保存起来 3.返回用户的唯一标示
###2.2验证请求唯一性时需要做的事情 1.获得用户的唯一标示 2.通过唯一标示获取上次请求的时间戳和随机数 3.验证时间戳是不是比上次请求的时间戳要晚,随机数是不是和前一次随机数相同 同时达到这两个条件时认定请求重复 4.验证通过吧这次的请求随机数和时间戳存入
以上就是基本解决思路,可以给存入的 时间戳和随机数一个过期时间这样当两次请求距离时间过久也一样会过滤掉