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中进行身份认证
Oct 09 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
Nov 10 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
php获取指定日期之间的各个周和月的起止时间
Nov 24 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
Mar 12 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
php成功操作redis cluster集群的实例教程
Jan 13 PHP
php用xpath解析html的代码实例讲解
Feb 14 PHP
php数组和链表的区别总结
Sep 20 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
中篇:安装及配置PHP
2006/12/13 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
smarty简单应用实例
2015/11/03 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
django settings.py 配置文件及介绍
2019/07/15 Python
python ftplib模块使用代码实例
2019/12/31 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
大学生个人自荐信
2014/02/24 职场文书
企业办公室岗位职责
2014/03/12 职场文书
主题团日活动总结
2014/06/25 职场文书
商超业务员岗位职责
2015/02/13 职场文书
个人年度总结报告
2015/03/09 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python