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 相关文章推荐
2.PHP入门
Oct 09 PHP
PHP新手上路(八)
Oct 09 PHP
php 多个submit提交表单 处理方法
Jul 07 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
ThinkPHP连接Oracle数据库
Apr 22 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
Apr 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
建立动态的WML站点(一)
2006/10/09 PHP
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
用jscript实现列出安装的软件列表
2007/06/18 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
团日活动总结
2014/04/28 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书