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格式化工具Beautify PHP小小BUG
Apr 24 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
Apr 18 PHP
MySQL连接数超过限制的解决方法
Jul 17 PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
分享50个提高PHP执行效率的技巧
Dec 26 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
CI框架中类的自动加载问题分析
Nov 21 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 PHP
php中get_object_vars()在数组的实例用法
Feb 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 download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
javascript中new关键字详解
2015/12/14 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
利用Python获取操作系统信息实例
2016/09/02 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
python 二维数组90度旋转的方法
2019/01/28 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
新闻系毕业生推荐信
2013/11/16 职场文书
利群广告词
2014/03/20 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL
排查Tomcat进程假死的问题
2022/05/06 Servers
SQL Server 中的事务介绍
2022/05/20 SQL Server