接口设计原则(安全方面)

接口设计原则(安全方面)


1.数据有效性校验
  • 常规性校验:包括必填字段,长度检测。格式校验等。

  • 鉴权校验:当前请求必须符合权限等。

  • 业务校验:根据实际业务而定,比如订单金额不能小于0等等。

  • 作用:在接口层做用户鉴权校验和参数校验,比如做ID基础校验,id<0 直接拦截这样就很有效的能够解决恶意请求从而导致缓存击穿的问题。这里有一个小细节,就是我们开发的时候要保持一个不信任的心,就是不要相信任何的调用方,比如你提供了一个API接口出去,有几个参数。我觉得作为被调用方,任何可能的参数都应该被考虑到去做校验。因为你不相信任何调用你的人,你不知道她会传什么参数给你。举个简单的例子,如果你的接口是分页查询的,若是你没有对分页参数的大小做限制,调用的人万一一口气查询十万条数据,一次请求就会要好几秒。多几个并发不就挂掉了。

2.幂等设计
  • 幂等的概念: 多次调用对系统的产生的影响是一样的,即对资源的作用是一样的,但是返回值允许不同。

  • 为什么需要幂等 : 在系统高并发的情况下,很有可能因为网络问题,阻塞等等导致客户端或者调用方不能及时的收到服务器的反馈甚至调用超时的问题。比如:当创建订单时,第一次调用服务超时,再次调用是否会产生两个订单?

  • HTTP的幂等性:

    (1)GET : 只是获取资源,对资源本身并没有副作用。天然的幂等性。

    (2)HEAD: 本质上和GET一样,获取请求头的信息,主要是探活的作用,具有幂等性。

    (3)OPTIONS: 获取当前URL所支持的方法,因此也是具有幂等性的。

    (4)DELETE: 用于资源的删除,具有副作用,但是他应满足幂等性,如根据ID删除某一个资源。调用方法可以调用N次而不用担心出错。

    (5)PUT: 用于资源更新,有副作用,但是他应该满足幂等性,如根据ID更新数据,调用多次和N次的作用是相同的。

    (6)POST: 用于资源添加,多次提交可能产生副作用,比如订单的提交等等。

  • 如何实现幂等:

    (1)前端解决幂等的方法为:为关键性的操作做防抖,比如按钮置灰,隐藏等等。防止用户多次点击所引起的不必要麻烦。

    (2)后端解决幂等的方法也同样重要,因为前端只能从用户端防止,并不能在接口层做限制。解决方法为:使用Token。比如生成订单,需要前端在用户点击生成订单的时候,先向服务端请求一个唯一Token.然后再将Token随表单一起提交。后端拿到请求的时候需要先将请求的Token去除去做校验,只有当Token存在的时候才会将你的Token从Redis种删除,然后再获取表单数据进行DB的操作;若是Token压根就不存在就说明已经有了其他线程的请求已经在处理了这个数据,所以这次请求是多余的。
    (3)后端还有一种方法就是使用Redis的setnx来给需要做幂等的接口做互斥锁。

3.数据加密
  • 数据在传输的过程中我们知道资源数据都是直接爆露出口来的,用抓包工具就可以很轻松的修改。所以一般我们会对传输的数据进行加密。常规的做法是对敏感数据(比如用户的身份证号等)做MD5加密。现在主流的做法是使用HTTPS协议,再HTTP和TCP之间添加一层数据安全层(SSL层),这一层负责数据的加密和解密。
4.时间戳机制
  • 数据经过了加密处理,就算他们抓取到了数据也看不到真实数据。但是照样会有脑子有问题的人的不关心真实数据,就是要搞你,一直进行恶意请求,这个时候的简单做法就是添加时间戳机制,在每次的请求中加入当前时间(可以对这个时间进行MD5加密使搞你的人一时间搞不清楚这个数据的实际意义),服务端对每次请求中的时间(解密之后)与当前系统的时间作对比,看是否在一个固定的时间范围内,比如5s。恶意伪造的数据(在没有弄清楚这个混淆时间戳的字段之前)是没办法频繁的更改数据中心的时间的,超过10s就可以当做非法请求了。
5.黑名单机制
  • 通过频率组件对所访问的数据进行限制。比如每分钟请求次数超过多少就讲其IP加入黑名单中。拒绝其高频词访问。我们可以对其黑名单分下等级:一级状态(为其每一个请求进行延时处理),2级状态(30秒内不再接受其请求),3级状态(5分钟内不再接受其请求),4及状态(半小时内不再接受其请求),永别状态(永久不再接受其请求)等等。
6.限流机制

介绍几个常用的限流算法:

(1)令牌桶限流:原理是服务端以一定的速率向桶中放入令牌,若是填满就全部丢弃。请求来时就从桶中取出令牌,如果能取到,则可以继续完成请求。否则就拒绝或者等待。令牌桶允许一定程度的突发量,只要有令牌就可以处理,也支持多拿。但你请求的频率是由我往桶中放令牌的频率所决定的。

(2)漏铜限流:漏桶算法的原理是按照固有的速率流出请求,流入任意速率的请求,当请求数超出桶的容量时,新的请求等待或者拒绝服务。请求的速率由漏出的速率决定。

(3)计数器限流:计数器是一种简单粗暴的算法,主要用来限制总并发数,比如某一接口不能超出数据库DB或者Redis的连接池,或者线程池,秒杀等等的并发数。计数器只要一定时间内的请求综合达到设定的阈值则进行限流。请求跟你的计数器阈值大小有关。


版权声明:本文为qq_41141246原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。