• 售前

  • 售后

热门帖子
入门百科

PHP开辟api接口安全验证的实例解说

[复制链接]
心随674 显示全部楼层 发表于 2021-10-25 19:37:19 |阅读模式 打印 上一主题 下一主题
php的api接口
在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种环境,xml和json,在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证。
验证原理
示意图

原理
从图中可以看得很清楚,前台想要调用接口,需要使用几个参数天生署名。
时间戳:当前时间
随机数:随机天生的随机数
口令:前背景开发时,一个双方都知道的标识,相称于暗号
算法规则:商定好的运算规则,上面三个参数可以利用算法规则天生一个署名。
前台天生一个署名,当需要访问接口的时间,把时间戳,随机数,署名通过URL传递到背景。背景拿到时间戳,随机数后,通过一样的算法规则盘算出署名,然后和传递过来的署名举行对比,一样的话,返回数据。
算法规则
在前背景交互中,算法规则是非常告急的,前背景都要通过算法规则盘算出署名,至于规则怎么订定,看你怎么高兴怎么来。
我这个算法规则是
1 时间戳,随机数,口令按照首字母巨细写顺序排序
2 然后拼接成字符串
3 举行sha1加密
4 再举行MD5加密
5 转换成大写。
前台
这里我并没有实际的前台,直接使用一个PHP文件代替前台,然后通过CURL模拟GET请求。我使用的是TP框架,URL格式是pathinfo格式。
源代码
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2017/3/16 0016
  6. * Time: 15:56
  7. */
  8. namespace Client\Controller;
  9. use Think\Controller;
  10. class ClientController extends Controller{
  11. const TOKEN = 'API';
  12. //模拟前台请求服务器api接口
  13. public function getDataFromServer(){
  14.   //时间戳
  15.   $timeStamp = time();
  16.   //随机数
  17.   $randomStr = $this -> createNonceStr();
  18.   //生成签名
  19.   $signature = $this -> arithmetic($timeStamp,$randomStr);
  20.   //url地址
  21.   $url = "http://www.apitest.com/Server/Server/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}";
  22.   $result = $this -> httpGet($url);
  23.   dump($result);
  24. }
  25. //curl模拟get请求。
  26. private function httpGet($url){
  27.   $curl = curl_init();
  28.   //需要请求的是哪个地址
  29.   curl_setopt($curl,CURLOPT_URL,$url);
  30.   //表示把请求的数据已文件流的方式输出到变量中
  31.   curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
  32.   $result = curl_exec($curl);
  33.   curl_close($curl);
  34.   return $result;
  35. }
  36. //随机生成字符串
  37. private function createNonceStr($length = 8) {
  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.   * @param $timeStamp 时间戳
  47.   * @param $randomStr 随机字符串
  48.   * @return string 返回签名
  49.   */
  50. private function arithmetic($timeStamp,$randomStr){
  51.   $arr['timeStamp'] = $timeStamp;
  52.   $arr['randomStr'] = $randomStr;
  53.   $arr['token'] = self::TOKEN;
  54.   //按照首字母大小写顺序排序
  55.   sort($arr,SORT_STRING);
  56.   //拼接成字符串
  57.   $str = implode($arr);
  58.   //进行加密
  59.   $signature = sha1($str);
  60.   $signature = md5($signature);
  61.   //转换成大写
  62.   $signature = strtoupper($signature);
  63.   return $signature;
  64. }
  65. }
复制代码
服务器端
担当前台数据举行验证
源代码
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2017/3/16 0016
  6. * Time: 16:01
  7. */
  8. namespace Server\Controller;
  9. use Think\Controller;
  10. class ServerController extends Controller{
  11. const TOKEN = 'API';
  12. //响应前台的请求
  13. public function respond(){
  14.   //验证身份
  15.   $timeStamp = $_GET['t'];
  16.   $randomStr = $_GET['r'];
  17.   $signature = $_GET['s'];
  18.   $str = $this -> arithmetic($timeStamp,$randomStr);
  19.   if($str != $signature){
  20.    echo "-1";
  21.    exit;
  22.   }
  23.   //模拟数据
  24.   $arr['name'] = 'api';
  25.   $arr['age'] = 15;
  26.   $arr['address'] = 'zz';
  27.   $arr['ip'] = "192.168.0.1";
  28.   echo json_encode($arr);
  29. }
  30. /**
  31.   * @param $timeStamp 时间戳
  32.   * @param $randomStr 随机字符串
  33.   * @return string 返回签名
  34.   */
  35. public function arithmetic($timeStamp,$randomStr){
  36.   $arr['timeStamp'] = $timeStamp;
  37.   $arr['randomStr'] = $randomStr;
  38.   $arr['token'] = self::TOKEN;
  39.   //按照首字母大小写顺序排序
  40.   sort($arr,SORT_STRING);
  41.   //拼接成字符串
  42.   $str = implode($arr);
  43.   //进行加密
  44.   $signature = sha1($str);
  45.   $signature = md5($signature);
  46.   //转换成大写
  47.   $signature = strtoupper($signature);
  48.   return $signature;
  49. }
  50. }
复制代码
效果
  1. string(57) "{"name":"api","age":15,"address":"zz","ip":"192.168.0.1"}"
复制代码
总结
这种方法只是此中的一种方法,其实另有许多方法都是可以举行安全验证的。
以上这篇PHP开发api接口安全验证的实例讲解就是小编分享给大家的全部内容了,盼望能给大家一个参考,也盼望大家多多支持草根技能分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作