api接口安全通俗易懂的意思就是保证接口接收到的数据不是被篡改的,防止信息泄露造成损失。
那如何要加强接口的安全性呢?
一、数据加密
把h5生成的数据加密(我用的是对称加密,加密还有非对称加密),第三方加密类放到tp5框架下的extend文件夹下(我是用tp5框架做的,就以tp5框架举例了^_^),用第三方类要配好命名空间哦,加密算法可以看看这个https://blog.csdn.net/shenggaofei/article/details/52333687,通过
请求方法
function CurlPost($url, $param = null, $timeout = 10) { //初始化curl $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); // 设置请求的路径 curl_setopt($curl, CURLOPT_POST, 1); //设置POST提交 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //显示输出结果 curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //提交数据 if (is_array($param)) { curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($param)); } else { curl_setopt($curl, CURLOPT_POSTFIELDS, $param); } //执行请求 $data = $data_str = curl_exec($curl); //处理错误 if ($error = curl_error($curl)) { $log_data = array( 'url' => $url, 'param' => $param, 'error' => '<span style="color:red;font-weight: bold">' . $error . '</span>', ); } # 关闭CURL curl_close($curl); //json数据转换为数组 $data = json_decode($data, true);
//api返回数据解密
$api_des = config('api.mcrypt'); if ($api_des['is_open']) { $data1 = Des::decode($data, $api_des['key'], $api_des['iv']); $des_str = json_decode($data1, true); } if (!is_array($des_str)) { $des_str = $data_str; } return $des_str; }
把数据传输到接口,接口接到数据后按照加密的方法反向解出数据来,如果h5端的加密key,iv值丢失,把api
中加密的key,iv值更改这样数据解密不了,知道key,iv值伪造数据请求接口,接口也不会把信息传出,那要
是key、iv值知道了,但是接口的key、iv值没有更改,这样不就造成数据泄露了? 所以只把数据加密还是不
够的,还要增加签名
二、增加签名
签名就是把数据按照自己设定的算法进行加密,也是把数据加密了,但是签名的加密是进行算法后,转化成
json字符串,把json字符串md5,md5要按理来说是不能破解的,但是也能破解,破解的难度大,相对安全性高
一点。
下面是一个签名的简单算法,
在api有同样的签名的算法,api接收的数据(api已经解密的数据)通过签名算法生成一个加密的字符串与h5
传给接口的字符串是否一样,如果验证一样证明签名一样,可以调用接口。增加签名后,风险还是有的,就是
签名算法被泄露,造成接口的不安全,所以要增加鉴权。
三、增加鉴权
鉴权就是接口给的权限,鉴权验证是否能调用该接口。
举一个例子,
我的接口这边
'api_allow_access'=>[ '123456' => '123456', '123' => '123456' ], 有这样一个数组,我给h5的是 '123456' => ‘123456’,接收到的数据解密出来要验证是否
有app_id,如果没有,则验鉴失败,如果有验证是否在上面数组的key值中,没在数组的key值中,则验
鉴失败,在数组中取出对应的value值
我h5这边也有一个数组
'api_auth'=>[ 'app_id' => '123456', 'app_secret' => '123456' ],要把这个数组里面的app_id拼接到需要传的数组中
在接口安全性上,把上面的三个验证加上,我们的接口算是比较安全了。