php接口开发 安全_PHP开发api接口安全验证的实例讲解

php的api接口

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

验证原理

示意图

d8142e620225c1b921b2eecb6a06fde9.png

原理

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

时间戳:当前时间

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

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

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

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

算法规则

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

我这个算法规则是

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

2 然后拼接成字符串

3 进行sha1加密

4 再进行MD5加密

5 转换成大写。

前台

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

源代码

/**

* 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;

}

}

服务器端

接受前台数据进行验证

源代码

/**

* 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开发api接口安全验证的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

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

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

相关文章

树:重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建二叉树并返回。 /// 1/// …

css随堂笔记(一)

Css初体验第一天 1 css初识&#xff1a;css主要用于设置HTML页面中文本内容&#xff0c;图片的外形&#xff0c;以及版面的布局等外观显示样式 Css样式规范&#xff1a;h1{属性&#xff1a;值} 2 css的三总书写方式&#xff1a;1 行内样式 将样式写在标签里面,只能作用于当前标…

关于全排列

嗯... 关于全排列&#xff0c;有很多种种做法... 嗯.... 那什么叫全排列呢&#xff1f;&#xff1f;&#xff01;&#xff01; 从n个不同元素中任取m&#xff08;m≤n&#xff09;个元素&#xff0c;按照一定的顺序排列起来&#xff0c;叫做从n个不同元素中取出m个元素的一个排…

[Java]如何安排任务间隔运行

应用程序中经常需要在后台运行某些特定任务以在一定间隔内完成某些工作。 该示例可以是&#xff0c;服务在后台运行以清理应用程序&#xff0c;就像我们有Java Garbage集合一样。 在本文中&#xff0c;我将向您展示3种不同的方法来实现这一目标 他们如下 使用简单的线程 使…

Sky Line 与 ArcEngine的粘合剂 Composite UI AB?

如今的goverment领导们觉得地图都太抽象&#xff0c;只有google Earth式的应用能引起他们的兴趣&#xff0c;作为为公仆服务的我们自然要学习掌握3D GIS技术来提高zf的执政能力了&#xff0c;于是Sky Line来了&#xff0c;拿到开发手册的时候觉得接口不多应该很容易开发&#x…

php if终止,php判断用户是否掉线及关闭网页的方法分享

要实现判断用户已掉线并关闭网页&#xff0c;主要用到方法connection_status 和 connection_aborted。通过一个例子&#xff0c;来了解下它们的用法:echo str_repeat(" ",300);//以下不可省略&#xff0c;否则用户断线&#xff0c;php(线程)立即终止&#xff0c;不会…

默认方法一种扩展旧代码的方法

如您所知&#xff0c;Java的新版本于2014年3月18日发布&#xff0c;我将介绍一系列文章来演示其新功能&#xff0c;也许在某些方面&#xff0c;我将谈论我的想法和批评。 我认为重要的第一个功能是“默认方法”&#xff0c;在所有Java语言的先前版本中&#xff0c;接口只能包含…

vue 如何点击按钮返回上一页

1&#xff0c;vue 如何点击按钮返回上一页呢&#xff1f; 这是vue挂载的范围html代码 <div click"goOff()">返回</div> 下面是点击返回的方法 第一种只返回上一页 goOff(){ this.$router.go(-1); }, 第二种 返回上一页&#x…

2007白领职场成功需要哪“十商”

1.德商(MQ)&#xff1a;指一个人的道德人格品质。德商的内容包括体贴、尊重、容忍、宽容、诚实、负责、平和、忠心、礼貌、幽默等各种美德。 2.智商(IQ)&#xff1a;是一种表示人智力高低的数量指标。也可以表现为一个人对知识的掌握程度&#xff0c;反映人的观察力、记忆力、思…

Remove Element - LeetCode

目录 题目链接注意点解法小结题目链接 Remove Element - LeetCode 注意点 输入的数组是无序的解法 解法一&#xff1a;使用了erase函数&#xff0c;将等于val的值移除。时间复杂度为O(n) class Solution { public:int removeElement(vector<int>& nums, int val) {fo…

DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...

url控制第二种写法&#xff08;只要继承了ViewSetMixin&#xff09; url(r^pub/$,views.Pub.as_view({get:list,post:create})), #获取所有记得路由后面加$结束符 #pub/?formatjsonurl(r^pub\.(?P<format>\w)$,views.Pub.as_view({get:list,post:create})), #pu…

要配置php环境_只需修改,要配置Apache的PHP环境,只需修改()。

案例分析一&#xff1a;假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送&#xff0c;其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期&#xff0c;并且在DMA传送完成后的中断…

使用Java 8和Lambda简化ReadWriteLock

考虑到旧版Java代码&#xff0c;无论您在哪里看&#xff0c;带有lambda表达式的Java 8绝对可以提高质量和可读性。 今天&#xff0c;让我们看一下ReadWriteLock以及如何使它使用起来更简单。 假设我们有一个称为Buffer的类&#xff0c;该类可以记住队列中的最后几条消息&#x…

[导入]C#好书盘点【月儿原创】

C#好书盘点【月儿原创】 文章来源:http://blog.csdn.net/21aspnet/archive/2007/07/07/1682200.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/07/08/816177.html

岁月如歌,人生如诗

虎跃千山龙腾海&#xff0c;春满家园喜满怀。新的一年&#xff0c;孕育着新的生命&#xff1b;新的一年&#xff0c;掸去了飞雪的扬花&#xff0c;满心的惬意告诉我们&#xff0c;所有的期盼与期望&#xff0c;一切的向往与憧憬正向着我们走近&#xff0c;向着春天融合。 ​ 新…

DOM编程以及domReady加载的几种方式

1&#xff0c;关于DOM编程 DOM编程主要是对dom树节点进行操作&#xff0c;所以你必须掌握基本的节点类型&#xff0c;如何去获取节点名字以及值&#xff08;这些相关知识你可以去网上查&#xff0c;这里推荐一个慕课学习网站->https://www.imooc.com/video/9491&#…

倒叙输出 php,php foreach正序倒序输出示例代码

实现代码&#xff1a;// 正序foreach($files as $file_num > $file) {if(is_file($directory.$file)){//$file iconv("gb2312","UTF-8",$file); //或者 iconv("gb2312","UTF-8",$value);$date substr($file,0,9);echo ;echo ;ech…

黑色系产业结构

转载于:https://www.cnblogs.com/luoluo-123/p/11143867.html

在Java 8 Lambda中创建自己的循环结构

Java没有简单的构造可以重复N次。 当然&#xff0c;我们可以创建一个for循环&#xff0c;但是很多时候我们甚至都不关心在循环中创建的变量。 我们只想重复一些代码N次&#xff0c;仅此而已。 使用Java 8中的lambda时&#xff0c;您可以尝试执行以下操作&#xff1a; public c…

Smart Form Tutorial(适用新手学习)

发现Smart Form在ECC6中和4.6C相比改变了不少&#xff0c;最近重新研究了一下。help.sap.com上的文档基本上是针对新特性的&#xff0c;不过例子却还是旧的。做个笔记省的以后找不到最新的example。最大的改变在Table上&#xff0c;现在table的header和footer比以前好做了。还是…