前三点我们可以使用加密的方式来解决,第四点我们写代码时要注意防xss和sql注入等。
设置基本参数
首先是接口访问的安全性的保障,不是谁想对接口访问就能访问的,解决思想:
一般我们可以设置一些访问的基本参数,然后对基本参数进行加密生成sign值,然后将这些基本参数和sign都放在http协议的header头中,每一次访问都要带上这些基本参数和sign。
对于app的接口的基本参数:
app的版本号version 如version1.1.2
app的设备的类型app_type:安卓手机,安卓平板,IOS手机,IOS平板
app的设备的设备号:did
model:设备的型号:如三星,oppo15,huaweip30等
时间戳:
sign值:使用上面参数进行加密得到的值
(也可以自定义一些参数)
sign的生成可以使用AES的加密方式,注意客户端的加密解密的算法要一致。laravel框架中加密的密串是app_key使用的算法是AES-256-CBC
sign值也可以使用md5加密方式,我们可以把基本参数先进行ksort排序,再转成键值对的字符串然后对其md5加密成sign,然后把基本参数和sign值一起传入给服务端,在服务端重复客户端的加密方式,对比sign的值。
对于web的接口的基本参数:
随机数
时间戳
使用随机数和时间戳和秘钥key生成sign值
(也可以有别的基本参数,可以自定义)
当我们发送http请求时,我们应该将随机数时间戳,以及使用随机数和时间戳和秘钥key通过AES或者MD5加密生成的sign值,传递到服务端,在服务端重复客户端的加密方式对比sign的值。(秘钥key值不用传递,是服务端和客户端共同约定的密串)(这种方式类似于微信公众号加密的方式)
以上方式的优点和弊端
使用以上的加密方式可以防止用户对数据包进行串改,但是防不住用户将网络包进行抓包,然后对接口发送大量的请求占用资源。
解决方案:
我们可以对接口进行时间上的判断,我们可以拿服务端的时间戳和客户端传来的时间戳的差值不能超过10秒,否则用户则访问不到我们的接口。
以上方式的优点和缺点
优点:
可以解决用户一直往接口发送请求。
缺点:
1由于客户端的时间戳和服务的时间戳不一定一样,这样用户可以修改客户端的时间,继续在10种内发送大量的请求。
2即使时间问题解决,用户仍旧可以在10秒以内大量的往接口发送请求。
解决方案:
对于时间问题,我们可以在服务端写一个返回时间戳的接口,返回的时间最好是毫秒。
我们可以验证完sign值后将sign存入到redis中(数据库,文件缓存,memcache中),过期时间只要比10秒中大一点即可,等下一次检测sign值之前判断redis中有无sign值,如果有说明sign已经被验证过了,说明被别人抓包了,如果没有我们在检测sign同时将sign值存入到redis中。
所以检测流程:
1先检测时间是否超过规定时间。
2检测redis中有无sign值。
3检测sign是否正确。
4对发送过来的参数进行解密。
注意:我们传递参数也可以传递使用对称加密加密后的密串,在服务端可以进行解密获取参数。我们服务端返回数据时亦可以使用对称加密,客户端收到数据后可以对密串进行解密