PHP开发中保证接口安全

模拟客户端请求:

<?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;
    }
}

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

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL远程访问报错解决

2019独角兽企业重金招聘Python工程师标准>>> 我之前的一篇博客讲了MySQL配置远程访问的方法&#xff0c;但是可能配置了账户以后还是不能访问&#xff0c;这可能是防火墙的原因&#xff0c;在CentOS里&#xff0c;我们修改一下防火墙设置就可以了 1. 进入防火墙配置…

jssdk.php

/*** Created by PhpStorm.* Date: 17/8/19* Time: 下午2:24*/ class JSSDK {private $appId;private $appSecret;public function __construct($appId, $appSecret) {$this->appId $appId;$this->appSecret $appSecret;}public function getSignPackage() {$jsapiTick…

GNU/Linux与开源文化的那些人和事

一、计算机的发明 世上本无路&#xff0c;走的人多了&#xff0c;就有了路。世上本无计算机&#xff0c;琢磨的人多了……没有计算机&#xff0c;一切无从谈起。 三个人对计算机的发明功不可没&#xff0c;居功至伟。阿兰图灵&#xff08;Alan Mathison Turing&#xff09;、阿…

PHP使用PHPMailer发送邮件

1. 首先下载phpmailer插件,并将插件复制到目录下 下载地址: http://download.csdn.net/download/m_nanle_xiaobudiu/10261269 2. home/view/user/mail_chck.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

python学习记录2

一、两个模块&#xff08;sys和os&#xff09; 1 #!/usr/bin/env python2 # _*_ coding: UTF-8 _*_3 # Author:taoke4 import sys5 print(sys.path)#打印环境变量6 print(sys.argv[0])#当前文件相对路径,sys.argv是一个列表&#xff0c;第一个元素为程序本身的相对路径&#xf…

cordova-config.xml配置应用图标

1. <icon src"res/icon/ios/browser.png"/> 2.规格&#xff1a; iphone平台一般要求3种规格的图片&#xff1a;1x、2x、3x&#xff0c;也是就Icon.png、Icon2x.png、Icon3x.png. 注意&#xff1a;iOS所有图标的圆角效果由系统生成&#xff0c;给到的图标本身不…

将 Figma 设计转换为 .NET MAUI Graphics 代码

原文链接&#xff1a;https://github.com/jsuarezruiz/figma-to-maui-graphics原文作者&#xff1a;jsuarezruiz翻译&#xff1a;沙漠尽头的狼(谷歌翻译加持)&#xff0c;翻译别扭&#xff0c;建议直接阅读原文使用FigmaSharp.Maui.Graphics将Figma设计转换为 .NET MAUI Graphi…

Android之上下文context

Context&#xff0c;中文直译为“上下文”&#xff0c;SDK中对其说明如下&#xff1a; 1、它描述的是一个应用程序环境的信息&#xff0c;即上下文。 2、该类是一个抽象(abstract class)类&#xff0c;Android提供了该抽象类的具体实现类。 3、通过它我们可以获取应用程序的资…

论坛中,无限分类的原理

1.创建数据表 CREATE TABLE category( cat_id SMALLINT unsigned not null auto_increment comment 类别id, cat_name VARCHAR(30) not null default comment 类别名称, par_id SMALLINT unsigned not null default 0 comment 类别父id, PRIMARY KEY (cat_id) )enginemyisam …

mooc- 基本程序设计方法week1,week2

学习了第一单元我们几本可以写出10行左右的代码。 week1:python编程之基本方法 1、从计算机到程序设计语言&#xff1a; 理解计算机&#xff1a;计算机是能够根据一组指令操作数据的机器。 功能性&#xff1a;可以进行数据计算 可编程性&#xff1a;根据一系列指令来执行 计算机…

Windows 11 的 2022 更新为每个人带来了新的东西

Windows 网站发布博客&#xff0c;宣布今天在 190 多个国家/地区推出 Windows 11 2022 更新。微软在过去一年中对 Windows 11 进行了非常大的改进&#xff0c;感觉每个月都有一次更新。对于之前的 Windows 11&#xff0c;相信很多人在使用过程中也遇到过或大或小的问题。而一部…

goaccess_nginx日志分析工具

在控制台分析nginx日志goaccess -f b.log生成html文件分析nginx日志vi ~/.goacce***ctime-format %Tdate-format %d/%b/%Ylog-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"各参数详解&#xff1a; man goaccess或Nginx Variable …

HTML5 Canvas 绘制六叶草

注意&#xff1a; context.arc(横坐标,纵坐标,弧半径,起始角度,终止角度,逆顺时针);这个函数挺难用&#xff0c;主要原因是最后参数和角度的关系。不管文档怎么说&#xff0c;按我的实际经验&#xff0c;逆顺时针false时&#xff0c;是逆时针旋转&#xff1b;逆顺时针true时&am…

tp框架中执行事务

function tran() {//定义事务成功失败的标志$mark true;//1. 实例化模型$model D(student);//2. 开启事务处理$model->startTrans();//3. ls减少2000$sql "update student set moneymoney-2000 where unamels";$result $model->execute($sql);//判断sql执行…

哪些听起来像段子一样的故事?

杭州海底世界&#xff0c;一个小走廊两边都是各种爬行动物展览。有两只蜥蜴当时是这个样子人还年轻&#xff0c;还比较猥琐&#xff0c;看到一个趴在另一个身上就觉得在做什么羞羞的事。于是就拍下来&#xff0c;发到群里&#xff0c;然后说了句交配中。然后一天就光拍照&#…

Event 事件 - 基础

事件驱动三要素 事件源&#xff1a;即触发事件的元素 事件&#xff1a;被JavaScript检测到的行为。例如&#xff1a; 鼠标点击 键盘按键 选输入框 事件处理函数&#xff1a;事件发生时要进行的操作&#xff0c;又叫做“事件句柄”或“事件监听器” 事件分类&#xff1a; 鼠标事…

String 与 StringBuilder 区别与用法

String用final修饰&#xff0c;实际上是不可更改的。我们平常用的“”来连接&#xff0c;实际执行过程中是将原字符串连接之后生成新的对象重新赋值给这个名字的字符串。Testpublic void myStrTest(){String s "str_s";System.out.println(s);String ss s.toUpperC…

防跳墙访问

出现场景: 1. 没有登录&#xff0c;也能访问网页 2. 没有相关权限&#xff0c;也能访问对应的控制器和方法 解决方案: 定义一个CommonController,其他控制器继承CommonController,在CommonController中定义初始化方法_initialize 注:这里用的是tp3.2框架,如果我们直接在Commo…

windows编译libevent时报告“缺少print_winsock_errors.obj”的解决

一、综述 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库。 在libevent官网(http://libevent.org)下载源码包&#xff0c;在Windows平台编译时&#xff0c;会报缺少“print_winsock_errors.obj”的错误。 二、原因及解决 经检查&#xff0c;这是因为源码包中缺少…

7.python之正则表达式re模块

一.正则表达式中常用元字符的复习。通配符系列.(点)匹配任意一个除换行符以外的字符。*(星号)用来匹配*星号前面的字符或者一组字符0到无穷次。可以写为0(加号)匹配加号前面的一个字符或者一组字符1到无穷次。可以写为1?(问号)匹配问号前面的一个字符或者一组字符0到1次。可以…