• 技术文章 >后端开发 >PHP问题

    php api 安全验证失败怎么办

    藏色散人藏色散人2021-11-26 10:16:10原创248

    php api安全验证失败的解决办法:1、使用一个PHP文件代替前台;2、通过CURL模拟GET请求;3、接受前台数据进行验证即可。

    本文操作环境:Windows7系统、PHP7.1、Dell G3。

    php api 安全验证失败怎么办?

    php的api接口

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

    验证原理

    示意图

    这里写图片描述

    原理

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

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

    算法规则

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

    我这个算法规则是

    前台

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

    源代码

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2017/3/16 0016
     * Time: 15:56
     */
    namespace Client\Controller;
    use Think\Controller;
    
    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 Server\Controller;
    use Think\Controller;
    
    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"}"

    总结

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

    推荐学习:《PHP视频教程

    以上就是php api 安全验证失败怎么办的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php接口安全
    上一篇:php 删除json 可以吗 下一篇:php双竖线表示什么意思
    Web大前端开发直播班

    相关文章推荐

    • 深入解析PHP8底层内核源码之SAPI(一)• PHP如何更好地调用API接口• 如何解决微信支付API v3回调通知出现乱码问题• 有关ThinkAPI短信服务的详细介绍

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网