現在的位置: 首頁 > 移動開發 > 正文

PHP開發api接口安全驗證

2020年01月15日 移動開發 ⁄ 共 3031字 ⁄ 字號 評論關閉

  在實際工作中,使用PHP寫api接口是經常做的,PHP寫好接口后,前臺就可以通過鏈接獲取接口提供的數據,而返回的數據一般分為兩種情況,xml和json,在這個過程中,服務器并不知道,請求的來源是什么,有可能是別人非法調用我們的接口,獲取數據,因此就要使用安全驗證。

  驗證原理

  從圖中可以看得很清楚,前臺想要調用接口,需要使用幾個參數生成簽名。

  ● 時間戳:當前時間

  ● 隨機數:隨機生成的隨機數

  ● 口令:前后臺開發時,一個雙方都知道的標識,相當于暗號

  ● 算法規則:商定好的運算規則,上面三個參數可以利用算法規則生成一個簽名。

  前臺生成一個簽名,當需要訪問接口的時候,把時間戳,隨機數,簽名通過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();

抱歉!評論已關閉.

奔驰宝马破解版下载 黄大仙资料大全2019 陕西丫丫麻将怎么下载 闲来湖南麻将手机版 富贵乐园棋牌游戏官网 保险和证券哪个发展更好 钱龙捕鱼个人技巧 哈哈湖南麻将安卓版 幸运赛车前一 网上李逵捕鱼赢钱技巧 乐透白城麻将手机版下载 山东体育彩票快乐扑克3 捕鱼游戏送彩金 重庆麻将换三张规则 网络广告赚钱 最新国际棋牌娱乐下载 哈尔滨2毛钱麻将微信群