PHP开发api接口安全验证
时间戳:表示当前时间戳。 随机数:由前台生成的随机字符串。 口令:双方事先商定的秘密标识。 算法规则:预先商定的运算规则,用于生成签名。 排序:将时间戳、随机数和口令按照字母大小写顺序排列。 拼接:将排序后的参数值按顺序拼接成一个字符串。 加密:对拼接后的字符串进行 SHA1 加密,再进行 MD5 加密。 转换:将最终的加密结果转换为大写字母。
发布日期:2025-05-04 10:16:21
浏览次数:7
分类:精选文章
本文共 3104 字,大约阅读时间需要 10 分钟。
PHP API 接口安全验证方法
在实际开发中,PHP被广泛用于构建API接口。API接口的数据返回通常有两种形式:XML 和 JSON。然而,作为服务器端,我们无法确切知道请求来源,因此需要采取安全验证措施,防止接口被非法调用。
验证原理
为了确保接口的安全性,我们需要前台在请求接口时提供一系列参数来生成签名。这些参数包括:
签名生成过程:
- 前台将时间戳、随机数和口令通过预定算法生成签名。
- 将签名、时间戳和随机数通过URL传递给服务器端。
- 服务器端使用相同的算法规则,结合传入的时间戳和随机数,重新生成签名。
- 对比生成的签名和传入的签名,如果一致则说明请求来源可信,返回数据;否则拒绝请求。
算法规则
算法规则是接口安全性的核心。我们可以采用以下步骤:
前台实现
在本示例中,前台使用 PHP 文件模拟请求,通过 CURL 模拟 GET 请求。具体实现如下:
namespace Client\Controller;use Think\Controller;class ClientController extends Controller{ const TOKEN = 'API'; public function getDataFromServer() { $timeStamp = time(); $randomStr = $this->createNonceStr(); $signature = $this->arithmetic($timeStamp, $randomStr); $url = "http://www.apitest.com/Server/Server/respond/t/$timeStamp/r/$randomStr/s/$signature"; $result = $this->httpGet($url); dump($result); } private function createNonceStr($length = 8) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } private 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); return strtoupper($signature); } private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); curl_close($curl); return $result; }} 服务器端实现
服务器端接收前台传递的参数并进行验证:
namespace Server\Controller;use Think\Controller;class ServerController 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) { echo "-1"; exit; } $arr = [ 'name' => 'api', 'age' => 15, 'address' => 'zz', 'ip' => "192.168.0.1" ]; echo json_encode($arr); } 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); return strtoupper($signature); }} 结果
通过上述验证机制,前台请求成功验证后,服务器返回以下数据:
{ "name": "api", "age": 15, "address": "zz", "ip": "192.168.0.1"} 这种双重加密机制确保了API接口的安全性,防止了非法调用和数据窃取。
发表评论
最新留言
表示我来过!
[***.240.166.169]2026年06月07日 22时22分54秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP学习笔记一:谁动了你的mail(),PHP?
2023-03-01
PHP安全实战
2023-03-01
php安装扩展
2023-03-01
php实战第二十二天
2023-03-01
rabbitmq重启
2023-03-01
php实现上传(多个)文件函数封装
2023-03-01
php实现下载文件方法
2023-03-01
php实现单链表
2023-03-01
php实现图片背景换色功能
2023-03-01
php实现多个一维数组对应合并成二维数组
2023-03-01
php实现多关键字查找方法
2023-03-01
PHP实现微信公众号H5支付
2023-03-01
PHP实现微信公众号网页授权
2023-03-01
PHP实现微信小程序推送消息至公众号
2023-03-01
rabbitmq逻辑与开发
2023-03-01
php实现根据身份证获取年龄
2023-03-01
PHP实现的MongoDB数据增删改查
2023-03-01
PHP实现的SSO单点登录系统,拿走就用吧
2023-03-01
php实现短信验证功能
2023-03-01