PHP开发api接口安全验证(转)

摘要:
在实际工作中,PHPAPI接口通常用PHP编写。PHP编写接口后,前台可以通过链接获取接口提供的数据。返回的数据通常分为两种情况,xml和json。在这个过程中,服务器不知道请求的来源是什么。可能是有人非法调用了我们的接口以获取数据,因此需要使用安全认证。

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

验证原理 示意图
PHP开发api接口安全验证(转)第1张

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

时间戳:当前时间 随机数:随机生成的随机数 口令:前后台开发时,一个双方都知道的标识,相当于暗号 算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名。 前台生成一个签名,当需要访问接口的时候,把时间戳,随机数,签名通过URL传递到后台。后台拿到时间戳,随机数后,通过一样的算法规则计算出签名,然后和传递过来的签名进行对比,一样的话,返回数据。

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

我这个算法规则是

时间戳,随机数,口令按照首字母大小写顺序排序 然后拼接成字符串 进行sha1加密 再进行MD5加密 转换成大写。

一、前台

这里我并没有实际的前台,直接使用一个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”}”

 转自:https://blog.csdn.net/qq_41642932/article/details/86689906

免责声明:文章转载自《PHP开发api接口安全验证(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(原创)使用mceusb设备,将lirc移植到android笔记详解 QT 主要类 QWidget下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

php Make编译PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.

在编译安装php的时候,make完之后,出现了如下报错: Generating phar.php Generating phar.phar PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled. pharcomm...

PHP安全

php如何做到安全 14 November 2013 0 一、概念和原则 所有的输入数据都是不安全的 我们不能信任任何外来的数据,例如用户的表单提交数据、请求字符串、甚至是RSS种子,都不能信任。这些数据都可以被伪造。 这些数据中可能故意包含某些字符,破坏程序的运行环境,例如可能包含有害的javascript代码。 因此,PHP预定义全局数组中的...

postman之动态参数获取

   接口测试中,经常用到上下游接口的依赖关系,下游接口的请求依赖上游接口的响应报文作为入参。 这样就是需要我们捕捉上游接口的响应内容,存储起来作为下游接口请求的入参。   这里举两个例子获取冬天参数,分别是xml和json格式的请求 xml传参格式 1、上游接口是获取省份信息、下游接口是通过省份获取城市信息 我们需要在接口请求的test页签下,捕捉上游接...

利用纯java捕获和播放音频

参考: 1.http://www.cjsdn.net/doc/jdk60/javax/sound/sampled/package-summary.html 2.http://www.cjsdn.net/doc/jdk60/javax/sound/sampled/package-tree.html 软件包 javax.sound.sampled 提供用于捕获...

php数组基础

一、php数组的声明      1、数组中可以有任意类型的数据      2、长度可以变长      3、数组的分类:           a、索引数组:数组是以从0开始的帧数作为索引值                声明:$arr = array(1,2);$arr[0] = 1;                计算数组长度:count($arr);...

C++ 之 伪随机数生成 <random>

C++ 标准库提供了生成随机和伪随机数的类。这些类包括: 随机数生成类:生成均匀分布整数序列的伪随机数生成器,包括随机数引擎、随机数引擎适配器以及预定义随机数生成器。 随机数分布类:将生成器生成的数字序列转换为遵循特定随机变量分布(如均匀分布、正态或泊松分布)的数字序列的对象。 随机数引擎 随机数引擎可以以种子数据为熵源生成伪随机数。 随机种子:初始化...