PHP开发api接口安全验证
发布日期:2025-05-04 10:16:21 浏览次数:7 分类:精选文章

本文共 3104 字,大约阅读时间需要 10 分钟。

PHP API 接口安全验证方法

在实际开发中,PHP被广泛用于构建API接口。API接口的数据返回通常有两种形式:XML 和 JSON。然而,作为服务器端,我们无法确切知道请求来源,因此需要采取安全验证措施,防止接口被非法调用。

验证原理

为了确保接口的安全性,我们需要前台在请求接口时提供一系列参数来生成签名。这些参数包括:

  • 时间戳:表示当前时间戳。
  • 随机数:由前台生成的随机字符串。
  • 口令:双方事先商定的秘密标识。
  • 算法规则:预先商定的运算规则,用于生成签名。
  • 签名生成过程

    • 前台将时间戳、随机数和口令通过预定算法生成签名。
    • 将签名、时间戳和随机数通过URL传递给服务器端。
    • 服务器端使用相同的算法规则,结合传入的时间戳和随机数,重新生成签名。
    • 对比生成的签名和传入的签名,如果一致则说明请求来源可信,返回数据;否则拒绝请求。

    算法规则

    算法规则是接口安全性的核心。我们可以采用以下步骤:

  • 排序:将时间戳、随机数和口令按照字母大小写顺序排列。
  • 拼接:将排序后的参数值按顺序拼接成一个字符串。
  • 加密:对拼接后的字符串进行 SHA1 加密,再进行 MD5 加密。
  • 转换:将最终的加密结果转换为大写字母。
  • 前台实现

    在本示例中,前台使用 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接口的安全性,防止了非法调用和数据窃取。

    上一篇:PHP开发规范PSR
    下一篇:PHP应用程序连接Oracle数据库Demo(附Oracle客户端安装文件)

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2026年06月07日 22时22分54秒