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 字符串函数收集
Mar 29 PHP
Apache 配置详解(最好的APACHE配置教程)
Jul 04 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
php多用户读写文件冲突的解决办法
Nov 06 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
PHP获取页面执行时间的方法(推荐)
Dec 10 PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 PHP
Laravel创建数据库表结构的例子
Oct 09 PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 PHP
php实现微信和支付宝支付的示例代码
Aug 11 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 构造函数construct的前下划线是双的_
2009/12/08 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
PHP获取url的函数代码
2011/08/02 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
javascript 写类方式之一
2009/07/05 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
javascript时间差插件分享
2016/07/18 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
跟老齐学Python之再深点,更懂list
2014/09/20 Python
CentOS安装pillow报错的解决方法
2016/01/27 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
python多线程与多进程及其区别详解
2019/08/08 Python
python编写微信公众号首图思路详解
2019/12/13 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
python 实现两个线程交替执行
2020/05/02 Python
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
密封类可以有虚函数吗
2014/08/11 面试题
网络管理员岗位职责
2014/03/17 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
实习单位指导教师评语
2014/12/30 职场文书
联谊活动总结范文
2015/05/09 职场文书
小学生安全保证书
2015/05/09 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
公司中层管理培训心得体会
2016/01/11 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
Java实现学生管理系统(IO版)
2022/02/24 Java/Android
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle