当前位置:首页 > 技术教程 > 技术文章 > 正文内容

PHP开发api接口,如何做才算是安全的

atao2年前 (2021-02-07)技术文章1435

php的api接口

在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证。

验证原理

示意图


原理

从图中可以看得很清楚,前台想要调用接口,需要使用几个参数生成签名。

时间戳:当前时间

随机数:随机生成的随机数

口令:前后台开发时,一个双方都知道的标识,相当于暗号

算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名。

前台生成一个签名,当需要访问接口的时候,把时间戳,随机数,签名通过URL传递到后台。后台拿到时间戳,随机数后,通过一样的算法规则计算出签名,然后和传递过来的签名进行对比,一样的话,返回数据。


算法规则

在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名,至于规则怎么制定,看你怎么高兴怎么来。

我这个算法规则是

1 时间戳,随机数,口令按照首字母大小写顺序排序

2 然后拼接成字符串

3 进行sha1加密

4 再进行MD5加密

5 转换成大写。

项目实例

//模拟前台请求服务器api接口
public function getDataFromServer(){
    $timeStamp = time(); //时间戳
    $randomStr = $this -> get_md5(); //随机数
    $signature = $this -> arithmetic($timeStamp,$randomStr); //生成签名
    $url = "http://abc.top/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}"; //url地址
    return http_get($url); //调用get接口并且返回值
}

//响应前台的请求
public function respond(){
    //验证身份
    $api = Request::param(); //TP中接参方法
    $str = $this -> arithmetic($api['t'],$api['r']);
    //判断是否验证成功
    if($str != $api['s']){
        return "接口验证失败";
    }
    //查询数据或者实现业务逻辑

    //验证成功了返回数据
    return json_encode(['msg'=>"测试成功",'code'=>200]);
}

//API接口加/解密算法
public function arithmetic($timeStamp,$randomStr){
    //判断接口请求时间是否超过三秒
    if(time()-$timeStamp<=3){
        $arr['timeStamp'] = $timeStamp;
    }
    $arr['randomStr'] = $randomStr;
    $arr['token'] = "APITOKEN"; //可从数据库调取
    //按照首字母大小写顺序排序
    sort($arr,SORT_STRING);
    //拼接成字符串
    $str = implode($arr);
    //进行sha1和md5加密
    $signature = sha1($str);
    $signature = md5($signature);
    //转换成大写
    $signature = strtoupper($signature);
    return $signature;
}

//随机字符串方法
public function get_md5(){
    return md5(password_hash(uniqid(), PASSWORD_DEFAULT));
}


扫描二维码推送至手机访问。

版权声明:本文由武景涛的博客发布,如需转载请注明出处。

本文链接:http://www.yizhanhongtu.cn/post/51.html

分享给朋友:

相关文章

什么是flex布局,它的常用属性有哪些

什么是flex布局,它的常用属性有哪些

什么是flex 布局?flex是 flexible box 的缩写,就是弹性布局的意思。任何一个元素(块元素、行内块元素、行内元素),都可以设置为弹性盒子属性。语法:块元素: display:flex...

PHP获取和操作配置文件php.ini的几个函数介绍

PHP获取和操作配置文件php.ini的几个函数介绍

1.ini_get()获取配置参数,ini_set()设置配置参数<?php echo ini_get('display_errors'); //1 //...

jQuery Growl 插件(消息提醒) 弹出层插件

jQuery Growl 插件(消息提醒) 弹出层插件

jQuery Growl 插件(消息提醒) 允许您很容易地在一个覆盖层显示反馈消息。消息会在一段时间后自动消失,不需要单击"确定"按钮等。用户也可以通过移动鼠标或点击关闭按钮加快隐...

MySQL中,21个写SQL语句的好习惯

MySQL中,21个写SQL语句的好习惯

每一个好习惯都是一笔财富,本文分 SQL 后悔药、SQL 性能优化、SQL 规范优雅三个方向,分享写 SQL 的 21 个好习惯。1. 写完 SQL 先 explain 查看执行计划。【SQL 性能优...

php版微信公众平台之微信网页登陆授权示例详解

php版微信公众平台之微信网页登陆授权示例详解

之前在项目中遇到网页授权登录这个需求,就对此做些总结记录。OAuth2.0授权:OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的个人信息,而...

ThinkPHP框架整合微信支付统一下单接口之Native扫码支付模式

ThinkPHP框架整合微信支付统一下单接口之Native扫码支付模式

此篇文章主要介绍了ThinkPHP6框架下整合微信支付之Native手册里面有的东西不多介绍,请求参数、返回结果之类的请移步官方手册查看。本文主要是通过一个demo实例进行讲解微信支付之统一下单接口。...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。