PHP开发api接口安全验证操作实例详解


Posted in PHP onMarch 26, 2020

本文实例讲述了PHP开发api接口安全验证操作.分享给大家供大家参考,具体如下:

php的api接口

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

验证原理示意图
PHP开发api接口安全验证操作实例详解
原理

从图中可以看得很清楚,前台想要调用接口,需要使用几个参数生成签名。
● 时间戳:当前时间
● 随机数:随机生成的随机数
● 口令:前后台开发时,一个双方都知道的标识,相当于暗号
● 算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名。

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

算法规则

在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名,至于规则怎么制定,前后端协商确定。

我这个算法规则是

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

前台

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

源代码

namespace app\service\controller;
use think\controller;

class CheckUrl 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){

      return ['status' => 0, 'msg' => '验证失败', 'data' => []];

    }

  }

  /**

   * @param $timeStamp 时间戳

   * @param $randomStr 随机字符串

   * @return string 返回签名

   */

  public function arithmetic($timeStamp, $randomStr){
		
		$arr = [
			'timeStamp' => $timeStamp,
			'randomStr' => $randomStr,
			'token' => self::TOKEN

		];

    //按照首字母大小写顺序排序

    sort($arr,SORT_STRING);

    //拼接成字符串

    $str = implode($arr);

    //进行加密

    $signature = sha1($str);

    $signature = md5($signature);

    //转换成大写

    $signature = strtoupper($signature);

    return $signature;

  }

}

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

实例展示php表单安全验证

这篇文章主要介绍了php token使用与验证方法,通过对form表单hidden提交字段的处理实现token验证功能,防止非法来源数据的访问。

  1. token功能简述
    PHP 使用token验证可有效的防止非法来源数据提交访问,增加数据操作的安全性
  2. 实现方法
    前台form表单:
<form action="do.php" method="POST">

<?php $module=mt_rand(100000,999999);?>

 <input type="text" name="sec_name" value=""/> // 实际要传递的值

 <input type="hidden" name="module" value="<?php echo $module;?>"/>

 <input type="hidden" name="timestamp" value="<?php echo time();?>"/>

 <input type="hidden" name="token" value="<?php echo md5($module.'#$@%!^*'.time());?>"/>

</form>

后台do.php的token验证部分:

$module = $_POST['module'];

$timestamp = $_POST['timestamp'];

$token = md5($module.'#$@%!^*'.$timestamp);

if($token != $_POST['token']){

return ['status' => 0, 'msg' => '非法数据来源', 'data' => []];

}

$sec_name=$_POST['sec_name'];

//PHP数据处理.....

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php设计模式 Adapter(适配器模式)
Jun 26 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
PHP之APC缓存详细介绍 apc模块安装
Jan 13 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
php实现随机生成易于记忆的密码
Jun 19 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
PHP dirname功能及原理实例解析
Oct 28 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 #PHP
php中加密解密DES类的简单使用方法示例
Mar 26 #PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 #PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 #PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 #PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 #PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
You might like
Terran兵种介绍
2020/03/14 星际争霸
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python查看微信好友是否删除自己
2016/12/19 Python
python实现K最近邻算法
2018/01/29 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
学习十八大的心得体会
2014/09/01 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
政府会议通知范文
2015/04/15 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL