做后端开发,避免不了要写接口,最开始我们写接口是为了满足实现具体的功能,能在客户端正常调用就行了,这种接口称为裸接口,就跟一个人没有穿衣服一样,我们在家的时候当然可以这么做,肆意放荡,这没关系,但是人总是要出门的,接触一些外人,这时候赤身裸体就不太好了吧。所有这时候我们要给自己穿上一件衣服。我们的接口也是一样的,一旦我们的接口上线暴露给外界了,必须要做一定的防护措施,给接口穿上“一件衣服”,避免一些“偷窥狂”的光临。
要避免接口被恶意调用,只要解决请求重放的问题就行了。
方法1:请求接口的参数中添加时间戳
具体实现原理:每次客户端发送请求时,获取当前时间戳,当参数一同发送到服务器,服务器拦截该请求,获取服务器上当前时间戳和客户端请求中的时间戳进行比较,如果两个时间戳相差超过60s的话就认定为非法请求,因为一般一次正常的http请求发送到服务器不会超过60秒,所以可以这样做。
这样可以做到简单的防重放,但是并不能 真的解决重放的问题,时间戳如果被修改为当前时间戳的话。那这种方式就失效了。
这时候就需要另外一种方式了
![](https://img.haomeiwen.com/i14814666/c8a677805142031f.png)
方法2:请求接口的参数中添加sign签名
具体实现原理:使用签名验证,保证每次请求时候签名只能使用一次。
客户端和服务器端约定一个生成签名串的算法,可以由客户端ip+加密密钥+当前时间戳进行MD5加密生成,前端生成签名串后,跟随参数一起发送到后台解密,并将该签名串保存在redis中,下次请求的时候,先在redis中取查找是否有该签名串,如果有,则说明是非正常请求,这时候就可以认定为非法操作。
但是这样也会存在一个问题,也就是随着时间的推移,redis中会保存越来越多的这样的sign签名,对于服务器资源消耗是一笔不小的开销,这时候需要是我们去清理了,当然我们可以选择给每个sign设定一个过期时间,让他自动清理,比如说设置1天的有效时长,这样当天就不能使用这个sign来请求了,但是一天后还是可以继续使用。这样也有隐患。这时候可以结合时间戳验证和sign签名验证。
![](https://img.haomeiwen.com/i14814666/234f73befe29971f.png)
方法3:请求接口的参数中添加sign签名+时间戳(推荐)
具体实现原理:客户端生成MD5加密签名串,和当前时间戳跟随请求的参数一起发送到后台,后台获取签名进行解密,然后保存到redis中并设置一个失效时长(60s),则60s内不能使用相同的sign发送请求,然后获取系统当前时间戳和前端发送过来的时间戳做比较,如果两者相差超过60s,则认定为非法操作。
这种方式既能保证防止请求重放,又能有效节省服务器资源,推荐使用。
![](https://img.haomeiwen.com/i14814666/c1f4e4365bd87907.png)
网友评论