博客
关于我
PHP开发api接口安全验证
阅读量:793 次
发布时间:2023-03-01

本文共 3190 字,大约阅读时间需要 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接口的安全性,防止了非法调用和数据窃取。

    转载地址:http://jptfk.baihongyu.com/

    你可能感兴趣的文章
    php 360 不记住密码,JavaScript_多种方法实现360浏览器下禁止自动填写用户名密码,目前开发一个项目遇到一个很 - phpStudy...
    查看>>
    php aes sha1解密,PHP AES加密/解密
    查看>>
    php csv 导出
    查看>>
    PHP imap 远程命令执行漏洞复现(CVE-2018-19518)
    查看>>
    php include和require
    查看>>
    ref 和out 区别
    查看>>
    php JS 导出表格特殊处理
    查看>>
    php json dom解析
    查看>>
    php laravel请求处理管道(装饰者模式)
    查看>>
    PHP mongoDB 操作
    查看>>
    ReentrantLock读写锁
    查看>>
    php mysql procedure获取多个结果集
    查看>>
    php mysql query 行数,PHP和MySQL:返回的行数
    查看>>
    PHP mysql_real_escape_string() 函数防SQL注入
    查看>>
    php mysql优化方法_MySQL优化常用方法
    查看>>
    PHP OAuth 2.0 Server
    查看>>
    php odbc驱动,php常用ODBC函数集(详细)
    查看>>
    php openssl aes ecb,php openssl_encrypt AES-128-ECB iOS
    查看>>
    php paypal rest api,PayPal REST API指定网络配置文件PHP
    查看>>
    php pcntl 多进程学习
    查看>>