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 10 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
php使用curl存储cookie的示例
Mar 31 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
详解PHP中的PDO类
Jul 06 PHP
php目录拷贝实现方法
Jul 10 PHP
php实现curl模拟ftp上传的方法
Jul 29 PHP
日常整理PHP中简单的图形处理(经典)
Oct 26 PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 PHP
PHP的openssl加密扩展使用小结(推荐)
Jul 18 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 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/10/09 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
移动端界面的适配
2017/01/11 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
使用python3构建文件传输的方法
2019/02/13 Python
在django模板中实现超链接配置
2019/08/21 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
2014年党员教师自我剖析材料
2014/09/30 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
家长会感言
2015/08/01 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android