您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > php

PHP开发api接口安全验证的实例

时间:2019-11-26 11:39:12  来源:  作者:

php的api接口

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

验证原理

示意图

PHP开发api接口安全验证的实例

 

原理

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

时间戳:当前时间

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

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

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

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

算法规则

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

我这个算法规则是

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

2 然后拼接成字符串

3 进行sha1加密

4 再进行MD5加密

5 转换成大写。

前台

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

源代码

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/3/16 0016
 * Time: 15:56
 */
namespace ClientController;
use ThinkController;
class ClientController extends Controller{
 const TOKEN = 'API';
 //模拟前台请求服务器api接口
 public function getDataFromServer(){
 //时间戳
 $timeStamp = time();
 //随机数
 $randomStr = $this -> createNonceStr();
 //生成签名
 $signature = $this -> arithmetic($timeStamp,$randomStr);
 //url地址
 $url = "http://www.apitest.com/Server/Server/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}";
 $result = $this -> httpGet($url);
 dump($result);
 }
 //curl模拟get请求。
 private function httpGet($url){
 $curl = curl_init();
 //需要请求的是哪个地址
 curl_setopt($curl,CURLOPT_URL,$url);
 //表示把请求的数据已文件流的方式输出到变量中
 curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
 $result = curl_exec($curl);
 curl_close($curl);
 return $result;
 }
 //随机生成字符串
 private function createNonceStr($length = 8) {
 $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 $str = "";
 for ($i = 0; $i < $length; $i++) {
 $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
 }
 return "z".$str;
 }
 /**
 * @param $timeStamp 时间戳
 * @param $randomStr 随机字符串
 * @return string 返回签名
 */
 private function arithmetic($timeStamp,$randomStr){
 $arr['timeStamp'] = $timeStamp;
 $arr['randomStr'] = $randomStr;
 $arr['token'] = self::TOKEN;
 //按照首字母大小写顺序排序
 sort($arr,SORT_STRING);
 //拼接成字符串
 $str = implode($arr);
 //进行加密
 $signature = sha1($str);
 $signature = md5($signature);
 //转换成大写
 $signature = strtoupper($signature);
 return $signature;
 }
}

服务器端

接受前台数据进行验证

源代码

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/3/16 0016
 * Time: 16:01
 */
namespace ServerController;
use ThinkController;
class ServerController extends Controller{
 const TOKEN = 'API';
 //响应前台的请求
 public function respond(){
 //验证身份
 $timeStamp = $_GET['t'];
 $randomStr = $_GET['r'];
 $signature = $_GET['s'];
 $str = $this -> arithmetic($timeStamp,$randomStr);
 if($str != $signature){
 echo "-1";
 exit;
 }
 //模拟数据
 $arr['name'] = 'api';
 $arr['age'] = 15;
 $arr['address'] = 'zz';
 $arr['ip'] = "192.168.0.1";
 echo json_encode($arr);
 }
 /**
 * @param $timeStamp 时间戳
 * @param $randomStr 随机字符串
 * @return string 返回签名
 */
 public function arithmetic($timeStamp,$randomStr){
 $arr['timeStamp'] = $timeStamp;
 $arr['randomStr'] = $randomStr;
 $arr['token'] = self::TOKEN;
 //按照首字母大小写顺序排序
 sort($arr,SORT_STRING);
 //拼接成字符串
 $str = implode($arr);
 //进行加密
 $signature = sha1($str);
 $signature = md5($signature);
 //转换成大写
 $signature = strtoupper($signature);
 return $signature;
 }
}

结果

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


Tags:PHP api   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
php的api接口在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不...【详细内容】
2019-11-26  Tags: PHP api  点击:(69)  评论:(0)  加入收藏
▌简易百科推荐
序言:前段时间织梦因为版权的问题在网上闹得沸沸扬扬,也提醒了众多开发者选择cms上应该谨慎使用,今天给大家展示一款自己搭建的内容管理系统,不用担心版权的问题,而且非常容易维...【详细内容】
2021-11-30  小程序软件开发    Tags:管理系统   点击:(34)  评论:(0)  加入收藏
准备安装包(PHP: Hypertext Preprocessor)下载安装包以及组件wget https://www.php.net/distributions/php-8.0.0.tar.bz2wget https://github.com/phpredis/phpredis/archive...【详细内容】
2021-11-09  mimic96    Tags:PHP   点击:(40)  评论:(0)  加入收藏
golang context 很好用,就使用php实现了github地址 : https://github.com/qq1060656096/php-go-context context使用闭坑指南1. 将一个Context参数作为第一个参数传递给传入和...【详细内容】
2021-11-05  1060656096    Tags:PHP   点击:(41)  评论:(0)  加入收藏
一段数组为例:$list = array:4 [ 0 => array:7 [ "id" => 56 "mer_id" => 7 "order_id" => "wx163265961408769974" "is_postage" => 0 "store_name" => "奇...【详细内容】
2021-09-29  七七小影视    Tags:PHP   点击:(65)  评论:(0)  加入收藏
利用JS的CryptoJS 3.x和PHP的openssl_encrypt,openssl_decrypt实现AES对称加密解密,由于需要两种语言对同一字符串的操作,而CryptoJS 的默认加密方式为“aes-256-cbc”,PHP端也...【详细内容】
2021-09-16  李老师tome    Tags:对称加密   点击:(79)  评论:(0)  加入收藏
1、checkdate()验证格利高里日期即:日期是否存在。checkdate(month,day,year);month必需。一个从 1 到 12 的数字,规定月。day必需。一个从 1 到 31 的数字,规定日。year必需。...【详细内容】
2021-08-31  七七小影视    Tags:时间函数   点击:(80)  评论:(0)  加入收藏
对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无法显示或者操作了。其实,这也是一种精度越界之后产生的精度丢失问题。在我们的 PHP 代码中,最大的整数非常大,我...【详细内容】
2021-08-26  硬核项目经理    Tags:PHP   点击:(83)  评论:(0)  加入收藏
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。上文说过,物理结构是用于确定数据以何种方式存...【详细内容】
2021-07-19  硬核项目经理    Tags:线性表   点击:(94)  评论:(0)  加入收藏
一、开启IIS全部功能。二、部署PHP1.官网下载并解压PHP: https://windows.php.net/downloads/releases/2.将php.ini-development文件改为php.ini3.修改php.ini(1)去掉注释,并修...【详细内容】
2021-07-15  炘蓝火诗  今日头条  Tags:PHP环境   点击:(129)  评论:(0)  加入收藏
一、环境说明本文中使用本地VM虚机部署测试。OS:CentOS Linux release 7.8.2003 (Core)虚机配置:2核CPU、4G内存①系统为CentOS 7.8 x64最小化安装,部署前已完成系统初始化、...【详细内容】
2021-06-25  IT运维笔记  今日头条  Tags:PHP8.0.7   点击:(141)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条