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完整的日历类(CLASS)
Nov 27 PHP
ThinkPHP php 框架学习笔记
Oct 30 PHP
php 各种应用乱码问题的解决方法
May 09 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
php中time()和mktime()方法的区别
Sep 28 PHP
php调用C代码的实现方法
Mar 11 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
May 13 PHP
PHP 等比例缩放图片详解及实例代码
Sep 18 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
javascript parseInt 大改造
2009/09/27 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
[43:51]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS Secret
2018/03/31 DOTA
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
Python标准库itertools的使用方法
2020/01/17 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
Django实现简单的分页功能
2021/02/22 Python
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
优秀的个人求职信范文
2014/05/09 职场文书
团日活动总结怎么写
2014/06/25 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
大客户经理岗位职责
2015/04/09 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
MySQL 8.0 驱动与阿里druid版本兼容问题解决
2021/07/01 MySQL
Python学习开发之图形用户界面详解
2021/08/23 Python