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 fread()使用技巧
Jan 22 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
php类常量的使用详解
Jun 08 PHP
浅析php插件 HTMLPurifier HTML解析器
Jul 01 PHP
ThinkPHP中的常用查询语言汇总
Aug 22 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
PHP安装memcached扩展笔记
May 28 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP调用接口API封装的例子
Oct 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入门学习的几个不错的实例代码
2008/07/13 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
常用PHP框架功能对照表
2014/10/23 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
简单实现Python爬取网络图片
2018/04/01 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
django允许外部访问的实例讲解
2018/05/14 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
慈善捐赠倡议书
2014/08/30 职场文书
倡议书格式
2014/08/30 职场文书
写给老师的感谢信
2015/01/20 职场文书
靠谱准确的求职信
2019/04/02 职场文书
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android