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

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

atao4年前 (2021-02-07)技术文章3160

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

分享给朋友:

相关文章

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

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

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

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

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

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

thinkphp6资源路由解决同源策略、跨域问题。

thinkphp6资源路由解决同源策略、跨域问题。

一般开发接口资源请求服务端都会遇到跨域请求。在跨域请求的时候,明明设置的是POST请求,却请求的时候报跨域错误,检查http请求头发现不是POST请求,而是发起了OPTIONS请求。路由设置:Rout...

curl实用请求方法函数(个人用),含支付pem校验

curl实用请求方法函数(个人用),含支付pem校验

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这...

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

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

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

thinkPHP实现微信支付之退款,附demo示例

thinkPHP实现微信支付之退款,附demo示例

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