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 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
php自动获取目录下的模板的代码
Aug 08 PHP
php foreach 参数强制类型转换的问题
Dec 10 PHP
PHP 读取Postgresql中的数组
Apr 14 PHP
php使用curl访问https示例分享
Jan 17 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
标准PHP的AES加密算法类
Mar 12 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
Laravel 集成 Geetest验证码的方法
May 14 PHP
PHP实现简易计算器功能
Aug 28 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 get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
js获得鼠标的坐标值的方法
2013/03/13 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
Python的Django框架中settings文件的部署建议
2015/05/30 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
工程部主管岗位职责
2013/11/17 职场文书
应届专科生个人的自我评价
2014/01/05 职场文书
教师专业自荐书范文
2014/02/10 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
临床护理求职信
2014/04/26 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
新店开张活动方案
2014/08/24 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android