Conozca el tiempo efectivo de procesamiento del signo de la solución de seguridad de datos de la interfaz api en thinkphp

Conozca el tiempo efectivo de procesamiento del signo de la solución de seguridad de datos de la interfaz api en thinkphp

Generar marca de tiempo de 13 bits

Cree la clase Time.php en el directorio Y: \ thinkphpwu \ application \ common \ lib
Inserte la descripción de la imagen aquí

<?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);
    }
}

Generar firma de letrero


use app\common\lib\Time;



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

Establecer el período de validez del signo

Inserte la descripción de la imagen aquí
Establezca el período de validez del inicio de sesión en el archivo app.php en el directorio thinkphpwu \ application \ extra

<?php

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

Verificar la validez de la hora de la señal.

Inserte la descripción de la imagen aquí
Cree una nueva clase ApiAuth.php en el directorio 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;
    }
}

Clase de verificación de firma de referencia

Y: \ thinkphpwu \ application \ api \ controller
Inserte la descripción de la imagen aquí

Consulte el método de verificación de firma en la clase común Common.php del módulo api

<?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);
        }
    }
}

Para la misma firma, modificamos el período de validez. Si es de 600, significa que es válido dentro de los 10 minutos.
Utilice la solicitud del cartero y devuelva verdadero para indicar que la verificación es exitosa.

Inserte la descripción de la imagen aquíCambie el período de validez a 10, lo que significa 10 segundos, y luego use la solicitud del cartero y devuelva falso, lo que significa que la verificación falló
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/guo_qiangqiang/article/details/112138278
Recomendado
Clasificación