模拟客户端请求:

<?php
namespace Home\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.tp3.com/Home/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
namespace Home\Controller;
use Think\Controller;

class ServerController extends Controller{const TOKEN = 'API';

    //响应前台的请求
    public function respond(){//验证身份
        $timeStamp = $_GET['t'];
        $randomStr = $_GET['r'];
        $signature = $_GET['s']; // $signature 客户端请求地址中携带的签名,与服务端生成的签名进行比对
        $str = $this -> arithmetic($timeStamp,$randomStr);//$str 服务端根据客户端请求过来的数据生成的签名
        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;
    }
}

服务端根据客户端传递过来的时间戳和随机字符串,来按照约定好的生成签名的算法生成签名,并与客户端传递过来的签名进行对比

如果相同,则返回数据,如果不相同,则不返回数据

PHP开发中保证接口安全相关推荐

  1. Java开发中模拟接口工具moco的使用

    场景 在开发中需要依赖一些接口,比如需要请求一个返回Json数据的接口,但是返回Json数据的接口要么是没搭建,要么是交互比较复杂. 此时,就可以使用moco来模拟接口返回接口数据,以便开发和测试工作 ...

  2. android开发接口调用,Android开发中webService接口调用示例

    代码示例: package com.study.ws; import java.io.IOException; import org.ksoap2.SoapEnvelope; import org.k ...

  3. Python开发中的接口详解和使用方法

    在服务器环境实际开发过程中,往往要通过写接口来请求或者发送数据,那么到底什么是接口,如何通过调用接口发送或者请求数据呢? 一.接口的定义 简单来说,域名(地址)带上参数就是一个接口,然后通过调用此接口 ...

  4. 学习android开发中遇到的一些小问题

    菜鸟的学习笔记: (好多时候想着记录一下自己花了好长时间解决的问题,但是一直没有行动,某一天觉得记录这种事情还是有意义的,虽然中间的记录断断续续,也有时候忘记了记录,觉得记录一下也是自己的积累.) 1 ...

  5. C# 类中继承接口的属性

    在开发中面对接口编程,有时需要将属性放到接口中,但是在类中又要如何去继承接口的属性呢? 开始的时候,我以为只要继承了接口,就可以将属性拿来用了.代码如下: public interface IA {i ...

  6. C#中理解接口以及接口的作用

    在C#的开发中,接口是非常重要也非常好用的.可是很多时候很多人都不是很了解接口的做用,以及该如何使用.下面我们就来理解接口的作用,并看看如何使用吧. 假设我们公司有两种程序员:VB程序员,指的是用VB ...

  7. angular开发中对请求数据层的封装

    代码地址如下: http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项 ...

  8. 开发中是如何保证接口幂等性的?

    文章目录 一.定义 二.业务场景 三.保证幂等性常用方法 方案1: insert前先select(基于mysql的分布式锁) 方案2:加悲观锁 select * from table where id ...

  9. api 接口开发理论 在php中调用接口以及编写接口

    如: http://localhost/openUser.php?act=get_user_list&type=json 在这里openUser.php相当于一个接口,其中get_user_l ...

最新文章

  1. C语言--static全局使用示例
  2. python3安装scrapy问题解决
  3. 天梯赛 L1-027 出租 (20 分)
  4. [云炬创业基础笔记]第六章商业模式测试1
  5. JMeter获取JSON内容
  6. 2009年3月28日四级网络工程师 试卷答案、点评及讨论
  7. Angular应用带参数的路由实现
  8. html元素data属性设置变量,HTML5 自定义属性 data-* 和 jQuery.data 详解
  9. hexo博客添加暗色模式_我如何向网站添加暗模式
  10. Spring Data JPA 从入门到精通~关键字列表
  11. react更改路由入参_react路由传参方式
  12. python识别图片上的文字_python如何一行代码实现图片文字识别
  13. [导入]给老家新楼的对联
  14. 一个很好用的JavaScript的文件上传插件plupload
  15. 如何解决样本不均衡问题
  16. socket多人聊天程序C语言版(二)
  17. 闽教英语app 破解版 免费版
  18. linux 命令:zip 详解
  19. Android APP安全测试
  20. [转]漫谈个人知识管理-PKM的方法

热门文章

  1. 类QQ右下角弹出框(Qt)
  2. perl对文件和目录进行操作
  3. 欢迎来到元宇宙的虚拟世界
  4. 记一次引入Elasticsearch的系统架构实战
  5. 基于 Blazor 打造一款实时字幕
  6. NET问答: 是否有通用的方法判断一个 Type 是 Number ?
  7. asp.net core集成CKEditor实现图片上传功能
  8. SM2 国密算法被 Linux 内核社区接受
  9. 为什么我们需要Logstash,Fluentd等日志摄取器?
  10. .Net Core WebAPI + Axios +Vue 实现下载与下载进度条