1. 1. 安全措施
    1. 1.1. 1.数据加密
    2. 1.2. 2.数据加签
    3. 1.3. 3.时间戳机制
    4. 1.4. 4.AppId机制
    5. 1.5. 5.限流机制
    6. 1.6. 6.黑名单机制
    7. 1.7. 7.数据合法性校验
    8. 1.8. 总结

安全措施大体来看主要在两个方面
1.如何保证数据在传输过程中的安全性
2.数据已经到达服务器端,服务器端如何识别数据,如何不被攻击

安全措施

1.数据加密

我们知道数据在传输过程中是很容易被抓包的,如果直接传输比如通过 HTTP 协议,那么用户传输的数据可以被任何人获取,所以必须对数据加密,常见的做法对关键字段比如用户密码直接通过 MD5 产生信息摘要,现在主流的做法是使用 HTTPS 协议,在 HTTP 和 TCP 之间添加一层加密层(SSL层),这一层负责数据的加密和解密。

现在主流的加密方式有:
对称加密
对称密钥在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有 DES,AES,优点是计算速度快,缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥,如果一方的秘钥被泄露,那么加密信息也就不安全了。

非对称加密
服务端会生成一对密钥,私钥存放在服务器端,公钥可以发布给任何人使用;优点就是比起对称加密更加安全,但是加解密的速度比对称加密慢太多了,广泛使用的是 RSA 算法。

两种方式各有优缺点,而 HTTPS 的实现方式正好是结合了两种加密方式,整合了双方的优点,在安全和性能方面都比较好。

2.数据加签

数据加签就是由发送者产生一段无法伪造的一段数字串,来保证数据在传输过程中不被篡改,你可能会问数据如果已经通过 HTTPS 加密了,还有必要进行加签吗?数据在传输过程中经过加密,理论上就算被抓包,也无法对数据进行篡改,但是我们要知道加密的部分其实只是在外网,现在很多服务在内网中都需要经过很多服务跳转,所以这里的加签可以防止内网中数据被篡改。

//传参
参数1={参数1}&参数2={参数2}&……&参数n={参数n}&$sign={用户签名}

数据签名使用比较多的是 MD5 算法,将需要提交的数据通过某种方式组合和一个字符串,然后通过 MD5 生成一段加密字符串,这段加密字符串就是数据包的签名。

<?php

/**
 * @notes: 签名参数算法
 * @param array  $params 参数
 * @param string $secret 秘钥
 * @return string
 * sign = 参数1{参数1}&参数2{参数2}&……&参数n{参数n}{用户秘钥}
 */
function signature(array $params, string $secret)
{
    ksort($params);
    $tmp = array();
    foreach ($params as $key => $val) {
        $tmp[] = $key . $val;
    }
    $tmp = implode('', $tmp);
    return md5($tmp . $secret);
}

3.时间戳机制

数据是很容易被抓包的,但是经过如上的加密,加签处理,就算拿到数据也不能看到真实的数据,但是有不法者不关心真实的数据,而是直接拿到抓取的数据包进行恶意请求,这时候可以使用时间戳机制,在每次请求中加入当前的时间,服务器端会拿到当前时间和消息中的时间相减,看看是否在一个固定的时间范围内比如5分钟内,这样恶意请求的数据包是无法更改里面时间的,所以5分钟后就视为非法请求了,这样可以做到简单的防重放,但是并不能真的解决重放的问题,时间戳如果被修改为当前时间戳的话。那这种方式就失效了。

4.AppId机制

大部分网站基本都需要用户名和密码才能登录,并不是谁都能来能使用我的网站,这其实也是一种安全机制,对应的对外提供的接口其实也需要这么一种机制,并不是谁都可以调用,需要使用接口的用户需要在后台开通 AppId,提供给用户相关的密钥,在调用的接口中需要提供 AppId + 密钥,服务器端会进行相关的验证。

5.限流机制

本来就是真实的用户,并且开通了 AppId,但是出现频繁调用接口的情况,这种情况需要给相关 AppId 限流处理。

常用的限流算法包括:
1.令牌桶限流
令牌桶算法的原理是系统以一定速率向桶中放入令牌,填满了就丢弃令牌,请求来时会先从桶中取出令牌,如果能取到令牌,则可以继续完成请求,否则等待或者拒绝服务,令牌桶允许一定程度突发流量,只要有令牌就可以处理,支持一次拿多个令牌。

2.漏桶限流
漏桶算法的原理是按照固定常量速率流出请求,流入请求速率任意,当请求数超过桶的容量时,新的请求等待或者拒绝服务,可以看出漏桶算法可以强制限制数据的传输速度。

3.计数器限流
计数器是一种比较简单粗暴的算法,主要用来限制总并发数,比如数据库连接池、线程池、秒杀的并发数,计数器限流只要一定时间内的总请求数超过设定的阀值则进行限流。

6.黑名单机制

如果此 AppId 进行过很多非法操作,经过分析之后直接将此 AppId 列入黑名单,所有请求直接返回错误码,我们可以给每个用户设置一个状态比如包括:初始化状态,正常状态,中黑状态,关闭状态等等,或者我们直接通过分布式配置中心,直接保存黑名单列表,每次检查是否在列表中即可。

7.数据合法性校验

这个可以说是每个系统都会有的处理机制,只有在数据是合法的情况下才会进行数据处理,每个系统都有自己的验证规则,当然也可能有一些常规性的规则,比如身份证长度和组成,电话号码长度和组成等等。

合法性校验包括:
常规性校验:
包括签名校验,必填校验,长度校验,类型校验,格式校验等

业务校验:
根据实际业务而定,比如订单金额不能小于0、当前订单状态是否正确等

总结

本文大致列举了几种常见的安全措施机制,不过针对具体业务场景需要具体取舍跟运用。