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 相关文章推荐
解决phpmyadmin中文乱码问题。。。
Jan 18 PHP
PHP实时显示输出
Oct 02 PHP
php 文件缓存函数
Oct 08 PHP
php不用正则验证真假身份证
Nov 06 PHP
PHP反向代理类代码
Aug 15 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
php自动载入类用法实例分析
Jun 24 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 PHP
THINKPHP3.2使用soap连接webservice的解决方法
Dec 13 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
PHP convert_uudecode()函数讲解
Feb 14 PHP
PHP实现的多进程控制demo示例
Jul 22 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和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
PHP异常处理Exception类
2015/12/11 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
python读取html中指定元素生成excle文件示例
2014/04/03 Python
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
python模拟事件触发机制详解
2018/01/19 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
python学习笔记之多进程
2020/08/06 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
Linux操作面试题
2012/05/16 面试题
电子商务专业自荐信
2014/06/02 职场文书
创优争先心得体会
2014/09/11 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
建筑工程催款函
2015/06/24 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
Jsonp劫持学习
2021/04/01 PHP
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python