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类
Oct 09 PHP
MYSQL数据库初学者使用指南
Nov 16 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
php 远程图片保存到本地的函数类
Dec 08 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
解析PHP提交后跳转
Jun 23 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
php读取文件内容到数组的方法
Mar 16 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
关于laravel 日志写入失败问题汇总
Oct 17 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函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
微信小程序开发探究
2016/12/27 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
详解angular中的作用域及继承
2017/05/31 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
javascript 易错知识点实例小结
2020/04/25 Javascript
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
python反转列表的三种方式解析
2019/11/08 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
"火柴棍式"程序员面试题
2014/03/16 面试题
DOM和JQuery对象有什么区别
2016/11/11 面试题
医院护士的求职信
2014/01/03 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
历史专业学生的自我评价
2014/02/28 职场文书
服装采购员岗位职责
2014/03/15 职场文书
共产党员承诺书
2014/03/25 职场文书
关于爱国的标语
2014/06/24 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android