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在页面中调用fckeditor编辑器的方法
Jun 10 PHP
php实现将上传word文件转为html的方法
Jun 03 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
PHP生成图像验证码的方法小结(2种方法)
Jul 18 PHP
Yii2框架实现注册和登录教程
Sep 30 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
PHP JWT初识及其简单示例
Oct 10 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
Mac下关于PHP环境和扩展的安装详解
Oct 17 PHP
PHP 出现 http500 错误的解决方法
Mar 09 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
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
php 常用的系统函数
2017/02/07 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
vue导入.md文件的步骤(markdown转HTML)
2020/12/31 Vue.js
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
Python 实现微信防撤回功能
2019/04/29 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
Python的垃圾回收机制详解
2019/08/28 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
物业招聘计划书
2014/01/10 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
体育委员竞选稿
2015/11/21 职场文书