PHP开发api接口安全验证

php的api接口

在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证。

验证原理

示意图

 

PHP开发api接口安全验证

 

 

 

原理

从图中可以看得很清楚,前台想要调用接口,需要使用几个参数生成签名。

● 时间戳:当前时间

● 随机数:随机生成的随机数

● 口令:前后台开发时,一个双方都知道的标识,相当于暗号

● 算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名。

前台生成一个签名,当需要访问接口的时候,把时间戳,随机数,签名通过URL传递到后台。后台拿到时间戳,随机数后,通过一样的算法规则计算出签名,然后和传递过来的签名进行对比,一样的话,返回数据。

算法规则

在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名,至于规则怎么制定,看你怎么高兴怎么来。

我这个算法规则是

● 时间戳,随机数,口令按照首字母大小写顺序排序

● 然后拼接成字符串

● 进行sha1加密

● 再进行MD5加密

● 转换成大写。

前台

这里我并没有实际的前台,直接使用一个PHP文件代替前台,然后通过CURL模拟GET请求。

源代码

 1 <?php
 2 
 3 class ClientController
 4 {
 5     const TOKEN = ‘API‘;
 6 
 7     //模拟前台请求服务器api接口
 8     public function getDataFromServer()
 9     {
10         //时间戳
11         $timeStamp = time();
12         //随机数
13         $randomStr = $this->createNonceStr();
14         //生成签名
15         $signature = $this->arithmetic($timeStamp, $randomStr);
16         //url地址
17         $url = "http://test.vc/server.php/?t={$timeStamp}&r={$randomStr}&s={$signature}";
18         $result = $this->httpGet($url);
19         var_dump($result);
20     }
21 
22     //curl模拟get请求。
23     private function httpGet($url)
24     {
25         $curl = curl_init();
26         //需要请求的是哪个地址
27         curl_setopt($curl, CURLOPT_URL, $url);
28         //表示把请求的数据已文件流的方式输出到变量中
29         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
30         $result = curl_exec($curl);
31         curl_close($curl);
32         return $result;
33     }
34 
35     //随机生成字符串
36     private function createNonceStr($length = 8)
37     {
38         $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
39         $str = "";
40         for ($i = 0; $i < $length; $i++) {
41             $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
42         }
43         return "z" . $str;
44     }
45 
46     /**
47      * @param $timeStamp 时间戳
48      * @param $randomStr 随机字符串
49      * @return string 返回签名
50      */
51     private function arithmetic($timeStamp, $randomStr)
52     {
53         $arr[‘timeStamp‘] = $timeStamp;
54         $arr[‘randomStr‘] = $randomStr;
55         $arr[‘token‘] = self::TOKEN;
56         //按照首字母大小写顺序排序
57         sort($arr, SORT_STRING);
58         //拼接成字符串
59         $str = implode($arr);
60         //进行加密
61         $signature = sha1($str);
62         $signature = md5($signature);
63         //转换成大写
64         $signature = strtoupper($signature);
65         return $signature;
66     }
67 }
68 
69 $obj = new ClientController();
70 $obj->getDataFromServer();

服务器端

接受前台数据进行验证

源代码

 1 <?php
 2 
 3 class Server
 4 {
 5     const TOKEN = ‘API‘;
 6 
 7     //响应前台的请求
 8     public function respond()
 9     {
10         //验证身份
11         $timeStamp = $_GET[‘t‘];
12         $randomStr = $_GET[‘r‘];
13         $signature = $_GET[‘s‘];
14         $str = $this->arithmetic($timeStamp, $randomStr);
15         if ($str != $signature) {
16             echo "-1";
17             exit;
18         }
19         //模拟数据
20         $arr[‘name‘] = ‘api‘;
21         $arr[‘age‘] = 15;
22         $arr[‘address‘] = ‘zz‘;
23         $arr[‘ip‘] = "192.168.0.1";
24         echo json_encode($arr);
25     }
26 
27     /**
28      * @param $timeStamp 时间戳
29      * @param $randomStr 随机字符串
30      * @return string 返回签名
31      */
32     public function arithmetic($timeStamp, $randomStr)
33     {
34         $arr[‘timeStamp‘] = $timeStamp;
35         $arr[‘randomStr‘] = $randomStr;
36         $arr[‘token‘] = self::TOKEN;
37         //按照首字母大小写顺序排序
38         sort($arr, SORT_STRING);
39         //拼接成字符串
40         $str = implode($arr);
41         //进行加密
42         $signature = sha1($str);
43         $signature = md5($signature);
44         //转换成大写
45         $signature = strtoupper($signature);
46         return $signature;
47     }
48 }
49 
50 $obj = new Server();
51 return $obj->respond();

结果

PHP开发api接口安全验证

 

参考:https://mp.weixin.qq.com/s/AjatH-dinmTfqn3nURbWEA(注意URL传参格式,踩过坑

PHP开发api接口安全验证

上一篇:Windows下nginx+fastcgi+php的并发阻塞问题


下一篇:pip配置镜像源