Erfahren Sie in thinkphp, wie effektiv das Vorzeichen der Datensicherheitslösung für die API-Schnittstelle verarbeitet wird

Generieren Sie einen 13-Bit-Zeitstempel

Erstellen Sie die Time.php-Klasse im Verzeichnis Y: \ thinkphpwu \ application \ common \ lib
Fügen Sie hier eine Bildbeschreibung ein

<?php

namespace app\common\lib;

class Time
{
    
    

    //获取到13位数的时间戳 13位时间戳是把时间精确到毫秒级,所以两者是1000倍的关系
    public static function get13TimeStamp()
    {
    
    
        //用空格分隔,分别赋值给time1,和time2
        list($time1, $time2) = explode(' ', microtime());
        return $time2 . ceil($time1 * 1000);
    }
}

Zeichensignatur generieren


use app\common\lib\Time;



   public function testAes()
    {
    
    
        $data = array(
            'name' => 'qipa250',
            'url' => 'www.qipa250.com',
            'time' => Time::get13TimeStamp(),
        );
        echo '生成的签名是==' . ApiAuth::setSign($data);
    }

Stellen Sie die Gültigkeitsdauer des Zeichens ein

Fügen Sie hier eine Bildbeschreibung ein
Legen Sie die Gültigkeitsdauer des Zeichens in der Datei app.php im Verzeichnis thinkphpwu \ application \ extra fest

<?php

return [
    'admin_password_pre' => '_qipa250',//后台管理员密码加密后缀
    'aeskey' => 'QiPa250',//aes 密钥,服务端和客户端保持一致
    'aesiv' => '12345678901234567890123456789012',//aes iv,服务端和客户端保持一致
    'apptypes' => ['ios', 'android', 'wechat'],
    'api_sign_expire_time' => 10,//sign签名有效期为10s,
];

Überprüfen Sie die Gültigkeit der Vorzeichenzeit

Fügen Sie hier eine Bildbeschreibung ein
Erstellen Sie eine neue ApiAuth.php-Klasse im Verzeichnis Y: \ thinkphpwu \ application \ common \ lib

<?php

namespace app\common\lib;

use app\common\lib\Aes;


class ApiAuth
{
    
    

    /*
     * 生成签名
     */
    public static function setSign($data = [])
    {
    
    
        //1 把数组按照字段你排序
        ksort($data);
        //2 将数组更改为拼接字符串的格式
        $sign_str = http_build_query($data);
        //3 通过aes加密
        return (new Aes())->encrypt($sign_str);
    }

    //校验签名sign
    public static function checkSign($data)
    {
    
    
        //解密
        $str = (new Aes())->decrypt($data['sign']);
        if (!$str) {
    
    
            return false;
        }
        //将字符串你转成数组格式
        parse_str($str, $arr);
 
        //校验sign有效期 由于解析后的日期是13位的,除以1000后得到10位数
        //两个时间再相减, 超过设置的有效
        if ((time() - ceil($arr['time'] / 1000)) > config('app.api_sign_expire_time')) {
    
    
            return false;
        }
        return true;
    }
}

Referenzsignatur-Überprüfungsklasse

Y: \ thinkphpwu \ application \ api \ controller
Fügen Sie hier eine Bildbeschreibung ein

Weitere Informationen finden Sie in der Signaturüberprüfungsmethode in der allgemeinen Klasse Common.php des API-Moduls

<?php

namespace app\api\controller;

use app\common\lib\ApiAuth;
use app\common\lib\Time;
use think\Controller;

use app\common\lib\exception\ApiException;

use app\common\lib\Aes;

/*
 * api接口模块的公共控制器
 */

class Common extends Controller
{
    
    

    public function _initialize()
    {
    
    
        $this->checkRequestAuth();     
    }

    //验证方法
    /*
     * 检查app每一次提交的数据是否合法
     */
    public function checkRequestAuth()
    {
    
    

        //验证header头的信息
        $header = request()->header();
        //halt($header);


        //sign 客户端工程师加密,服务端工程师解密

        //基础数据校验
        //如果sign不存在,报错
        if (empty($header['sign'])) {
    
    
            throw new ApiException('签名不存在!');
        }

        if (empty($header['apptype'])) {
    
    
            throw new ApiException('客户端不存在!');
        }

        //验证请求的app客户端是否合法
        if (!in_array($header['apptype'], config('app.apptypes'))) {
    
    
            throw new ApiException('客户端不合法!', 400);
        }

        //校验sign
        $header_result = ApiAuth::checkSign($header);

        dump($header_result);

        die();

        if (!$header_result) {
    
    
            throw new ApiException('签名不合法!', 401);
        }
    }
}

Für dieselbe Signatur ändern wir den Gültigkeitszeitraum. Wenn er 600 Sekunden beträgt, bedeutet dies, dass er innerhalb von 10 Minuten gültig ist.
Verwenden Sie die Postbotenanforderung und geben Sie true zurück, um anzuzeigen, dass die Überprüfung erfolgreich ist.

Fügen Sie hier eine Bildbeschreibung einÄndern Sie die Gültigkeitsdauer auf 10, dh 10 Sekunden, und verwenden Sie dann die Postbotenanforderung. Geben Sie false zurück, was bedeutet, dass die Überprüfung fehlgeschlagen ist
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/guo_qiangqiang/article/details/112138278
Empfohlen
Rangfolge