当前位置:首页 > PHP教程 > php应用 > 列表

PHP开发api接口安全验证

发布:smiling 来源: PHP粉丝网  添加日期:2022-05-21 08:43:56 浏览: 评论:0 

php的api接口

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

验证原理

示意图

PHP开发api接口安全验证

原理

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

● 时间戳:当前时间

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

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

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

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

算法规则

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

我这个算法规则是

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

● 然后拼接成字符串

● 进行sha1加密

● 再进行MD5加密

● 转换成大写。

前台

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

源代码:

  1. <?php 
  2.  
  3. /** 
  4.  
  5.  * Created by PhpStorm. 
  6.  
  7.  * User: Administrator 
  8.  
  9.  * Date: 2017/3/16 0016 
  10.  
  11.  * Time: 15:56 
  12.  
  13.  */ 
  14.  
  15. namespace Client\Controller; 
  16.  
  17. use Think\Controller; 
  18.  
  19. class ClientController extends Controller{ 
  20.  
  21.     const TOKEN = 'API'
  22.  
  23.     //模拟前台请求服务器api接口 
  24.  
  25.     public function getDataFromServer(){ 
  26.  
  27.         //时间戳 
  28.  
  29.         $timeStamp = time(); 
  30.  
  31.         //随机数 
  32.  
  33.         $randomStr = $this -> createNonceStr(); 
  34.  
  35.         //生成签名 
  36.  
  37.         $signature = $this -> arithmetic($timeStamp,$randomStr); 
  38.  
  39.         //url地址 
  40.  
  41.         $url = "http://www.apitest.com/Server/Server/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}"
  42.  
  43.         $result = $this -> httpGet($url); 
  44.  
  45.         dump($result); 
  46.  
  47.     } 
  48.  
  49.     //curl模拟get请求。 
  50.  
  51.     private function httpGet($url){ 
  52.  
  53.         $curl = curl_init(); 
  54.  
  55.         //需要请求的是哪个地址 
  56.  
  57.         curl_setopt($curl,CURLOPT_URL,$url); 
  58.  
  59.         //表示把请求的数据已文件流的方式输出到变量中 
  60.  
  61.         curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); 
  62.  
  63.         $result = curl_exec($curl); 
  64.  
  65.         curl_close($curl); 
  66.  
  67.         return $result
  68.  
  69.     } 
  70.  
  71.     //随机生成字符串 
  72.  
  73.     private function createNonceStr($length = 8) { 
  74.  
  75.         $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  76.  
  77.         $str = ""
  78.  
  79.         for ($i = 0; $i < $length$i++) { 
  80.  
  81.             $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); 
  82.  
  83.         } 
  84.  
  85.         return "z".$str
  86.  
  87.     } 
  88.  
  89.     /** 
  90.  
  91.      * @param $timeStamp 时间戳 
  92.  
  93.      * @param $randomStr 随机字符串 
  94.  
  95.      * @return string 返回签名 
  96.  
  97.      */ 
  98.  
  99.     private function arithmetic($timeStamp,$randomStr){ 
  100.  
  101.         $arr['timeStamp'] = $timeStamp
  102.  
  103.         $arr['randomStr'] = $randomStr
  104.  
  105.         $arr['token'] = self::TOKEN; 
  106.  
  107.         //按照首字母大小写顺序排序 
  108.  
  109.         sort($arr,SORT_STRING); 
  110.  
  111.         //拼接成字符串 
  112.  
  113.         $str = implode($arr); 
  114.  
  115.         //进行加密 
  116.  
  117.         $signature = sha1($str); 
  118.  
  119.         $signature = md5($signature); 
  120.  
  121.         //转换成大写 
  122.  
  123.         $signature = strtoupper($signature); 
  124.  
  125.         return $signature
  126.  
  127.     } 
  128.  

服务器端

接受前台数据进行验证

源代码:

  1. <?php 
  2.  
  3. /** 
  4.  
  5.  * Created by PhpStorm. 
  6.  
  7.  * User: Administrator 
  8.  
  9.  * Date: 2017/3/16 0016 
  10.  
  11.  * Time: 16:01 
  12.  
  13.  */ 
  14.  
  15. namespace Server\Controller; 
  16.  
  17. use Think\Controller; 
  18.  
  19. class ServerController extends Controller{ 
  20.  
  21.     const TOKEN = 'API'
  22.  
  23.     //响应前台的请求 
  24.  
  25.     public function respond(){ 
  26.  
  27.         //验证身份 
  28.  
  29.         $timeStamp = $_GET['t']; 
  30.  
  31.         $randomStr = $_GET['r']; 
  32.  
  33.         $signature = $_GET['s']; 
  34.  
  35.         $str = $this -> arithmetic($timeStamp,$randomStr); 
  36.  
  37.         if($str != $signature){ 
  38.  
  39.             echo "-1"
  40.  
  41.             exit
  42.  
  43.         } 
  44.  
  45.         //模拟数据 
  46.  
  47.         $arr['name'] = 'api'
  48.  
  49.         $arr['age'] = 15; 
  50.  
  51.         $arr['address'] = 'zz'
  52.  
  53.         $arr['ip'] = "192.168.0.1"
  54.  
  55.         echo json_encode($arr); 
  56.  
  57.     } 
  58.  
  59.     /** 
  60.  
  61.      * @param $timeStamp 时间戳 
  62.  
  63.      * @param $randomStr 随机字符串 
  64.  
  65.      * @return string 返回签名 
  66.  
  67.      */ 
  68.  
  69.     public function arithmetic($timeStamp,$randomStr){ 
  70.  
  71.         $arr['timeStamp'] = $timeStamp
  72.  
  73.         $arr['randomStr'] = $randomStr
  74.  
  75.         $arr['token'] = self::TOKEN; 
  76.  
  77.         //按照首字母大小写顺序排序 
  78.  
  79.         sort($arr,SORT_STRING); 
  80.  
  81.         //拼接成字符串 
  82.  
  83.         $str = implode($arr); 
  84.  
  85.         //进行加密 
  86.  
  87.         $signature = sha1($str); 
  88.  
  89.         $signature = md5($signature); 
  90.  
  91.         //转换成大写 
  92.  
  93.         $signature = strtoupper($signature); 
  94.  
  95.         return $signature
  96.  
  97.     } 
  98.  

结果:

string(57) "{"name":"api","age":15,"address":"zz","ip":"192.168.0.1"}"

总结:

这种方法只是其中的一种方法,其实还有很多方法都是可以进行安全验证的。

Tags: PHP开发api接口安全验证

分享到: