首页 > 编程语言 >PHP利用前端跨域请求限制实现域名授权

PHP利用前端跨域请求限制实现域名授权

时间:2024-06-01 20:04:37浏览次数:15  
标签:return 跨域 redis redisKey Access header 域名 授权 PHP

在这里插入图片描述

前言

晓杰最近在开发一个活码引流系统,功能基本已经开发完成,正在研究授权方面的问题,下面是晓杰研究出来的结果,分享给大家,不喜勿喷!

研究过程

由于前后端分离架构,前端使用了Vue2.6 后端使用了ThinkPHP6 ,刚开始开发的时候就遇到了跨域请求失败的问题。
在这里插入图片描述
后续将后台增加了 $header[‘Access-Control-Allow-Origin’] = * 才解决了跨域问题,到了授权问题晓杰就想着是否可以利用该机制进行授权认证,目前晓杰暂时使用该授权方案。

创建授权表

在这里插入图片描述

新增授权站点

    public static function add($param){
        try {
           $validate = new AppConfigValidate();
            if (!$validate->scene('beforAdd')->check($param)) {
                return Res::error($validate->getError());
            }
            $param['status']=1;
            if(!$validate->scene('add')->check($param)){
                return  Res::error($validate->getError());
            }
           AppConfigModel::add($param);
            LogService::write('添加','添加');
          return  Res::ok();
        }catch (\PDOException $e){
            return Res::error($e->getMessage());
        }
    }

正常的新增,在支付授权订单后进行回调

//利用订单回调字符串 修改站点授权状态
$param = [
   'id' => $order['order_str'],
   'status' =>2
   ];
if (!AppConfigModel::edit($param)) {
   return 'fail';
}
//修改成功后 查询授权站点域名
$appInfo = AppConfigModel::findById($order['order_str']);
$redis = new Redis();
//加入Redis 后面会讲到这个作用
$redisKey = "newSoft:whiteHost:".$appInfo['app_domain'];
$redis ->set($redisKey,1);

授权检测

晓杰刚开始直接用查询数据库方式进行授权检测,但是考虑因为这个授权检测每次请求都会进行查询数据库,并发多了对服务器压力会变成负担,所以就想了个方案,Redis,刚开始还用array存储白名单 然后再进行
in_array 判断,晓杰觉得还是繁琐,一不做二不休 直接利用RedisKey是否存在进行判断。下面是实现代码,如有不足之处希望大家指出。

<?php

namespace app\common\middleware;


use app\common\utils\Massage;
use app\common\utils\Res;
use app\group\appConfig\model\AppConfigModel;
use Closure;
use think\cache\driver\Redis;
use think\Config;

class AllowCrossDomain
{

    protected $cookieDomain;

    protected $header = [
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Max-Age'           => 1800,
        'Access-Control-Allow-Methods'     => 'GET, POST, PATCH, PUT, DELETE, OPTIONS',
        'Access-Control-Allow-Headers'     => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With,token',
    ];

    public function __construct(Config $config)
    {
        $this->cookieDomain = $config->get('cookie.domain', '');
    }
    //校验白名单
    private static function checkWhiteHost($host){
        $redis = new Redis();
        $redisKey = "newSoft:whiteHost:localhost";
        //先判断localhost是否存在 不存在说明没有进行初始化
        if (empty($redis ->get($redisKey))){
            $map[] = ['status', '=', 2];
            $whiteHostList = AppConfigModel::list($map);
            $redis = new Redis();
            foreach ($whiteHostList as $key => $value){
                $redisKey = "newSoft:whiteHost:".$value['app_domain'];
                $redis ->set($redisKey,1);
            }
            $redisKey = "newSoft:whiteHost:localhost";
            $redis ->set($redisKey,1);
            $redisKey = "newSoft:whiteHost:127.0.0.1";
            $redis ->set($redisKey,1);
        }
        //组装RedisKey
        $redisKey = "newSoft:whiteHost:".$host;
        if (empty($redis ->get($redisKey))){
        //不存在返回false
            return false;
        }
        return true;
    }
    public function handle($request, Closure $next, ?array $header = [])
    {
        $header = !empty($header) ? array_merge($this->header, $header) : $this->header;

        if (!isset($header['Access-Control-Allow-Origin'])) {
            $origin = $request->header('origin');
            //获取请求host
            $host = parse_url($origin)['host'];
            //校验白名单
            if (!self::checkWhiteHost($host)){
            	//失败返回站点未授权
                return Res::error(Massage::WEBSITE_ERROR);
                die();
            }
            $header['Access-Control-Allow-Origin'] = $origin;
         
        }

        return $next($request)->header($header);
    }

}

#效果
刚测试没增加127.0.0.1这个域名白名单
在这里插入图片描述
增加进白名单后请求成功
在这里插入图片描述

本文作者

Soujer

标签:return,跨域,redis,redisKey,Access,header,域名,授权,PHP
From: https://blog.csdn.net/Soujer/article/details/139347478

相关文章

  • Springboot 开发 -- 跨域问题技术详解
    一、跨域的概念跨域访问问题指的是在客户端浏览器中,由于安全策略的限制,不允许从一个源(域名、协议、端口)直接访问另一个源的资源。当浏览器发起一个跨域请求时,会被浏览器拦截,并阻止数据的传输。这种限制是为了保护用户的隐私和安全,防止恶意网站利用用户的浏览器向其他网站......
  • 一对一视频直播app开发,实现跨域的多种方式
    一对一视频直播app开发,实现跨域的多种方式一、document.domain+iframe跨域此方案仅限主域相同,子域不同的跨域应用场景。实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。父窗口(http://www.demo.com/a.html))<iframeid="iframe"src="h......
  • 1v1视频软件源码,通过jsonp跨域的代码分析
    1v1视频软件源码,通过jsonp跨域的代码分析通常为了减轻1v1视频软件源码web服务器的负载,我们把js、css,img等静态资源分离到另一台独立域名的服务器上,在html页面中再通过相应的标签从不同域名下加载静态资源,而被浏览器允许,基于此原理,我们可以通过动态创建script,再请求一个带参网址实......
  • PHP历理 做一个计算24点的功能重构版
    注意:同样存在少数计算不出24的现象,不过已经接近完善了<?phpset_time_limit(0);$values=array(2,4,10,10);$result=24;$list=array();echo"<pre>";@makeValue($values);print_r($list);functionmakeValue($values,$set=array()){$words=array(&......
  • PHP历理 做一个计算24点的功能完善版
    <?php/*demo*/$tf=newTwentyFourCal();$tf->calculate(array(5,5,5,5));$tf->calculate(array(2,4,10,10));$tf->calculate(array(4,4,10,10));$tf->calculate(array(1,2,7,7));$tf->calculate(array(4,4,4,4));$tf->calculate(......
  • PHP历理 做一个计算24点的功能
    注意:有些计算24点的数字无法计算出来。不建议使用。<?phpfunctioncalculate24($nums){$operators=['+','-','*','/'];$combinations=[];foreach($numsas$num1){foreach($numsas$num2){if($n......
  • PHP执行sql
    PHP连接MySQL连接数据库<?php$severname='localhost';$username='root';$password='123456';$dbanme='数据库名'//创建连接$conn=newmysqli($servername,$username,$password,$dbname);//连接检测if($conn->connect_error){......
  • PHP执行sql
    PHP连接MySQL连接数据库<?php$severname='localhost';$username='root';$password='123456';$dbanme='数据库名'//创建连接$conn=newmysqli($servername,$username,$password,$dbname);//连接检测if($conn->connect_error){......
  • AntiSquat:利用人工智能技术检测误植域名和钓鱼域名的强大工具
    关于AntiSquatAntiSquat是一款功能强大的域名安全检测工具,该工具基于人工智能技术实现其功能,例如自然语言处理(NLP)和大语言模型(ChatGPT)等,可以帮助广大研究人员更好地检测误植域名和钓鱼域名。工具下载该工具基于Python3.8开发,因此我们首先需要在本地设备上安装并配置好Pyt......
  • PHP发票真假API在线文档、票据ocr识别、医疗票据查验
    翔云人工智能开放平台提供详细的发票查验API在线开发文档,不仅包含了PHP语言,还包含Java、python、go、C#、C++等众多的主流开发语言,便于有需要的用户快速的将发票查验功能集成到自己的系统或者应用中,极大的缩短了企业的开发时间和开发成本。翔云发票识别接口,运用自主OCR技术......