前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThinkPHP6使用中间件过滤来源网址或IP

ThinkPHP6使用中间件过滤来源网址或IP

作者头像
XiaoA
发布2023-06-23 17:01:54
3190
发布2023-06-23 17:01:54
举报

使用ThinkPHP6开发接口时会遇到前置过滤或判断,我们可以使用中间件功能。以下是单应用模式示例:

创建中间件

第1种方式,命令行方式:

代码语言:javascript
复制
php think make:middleware Filter

 第2种方式,手动在`app`目录下创建`middleware`文件夹,再创建中间件类:

代码语言:javascript
复制
<?php

namespace app\middleware;

class Filter
{
    public function handle($request, \Closure $next, $name)
    {
        //to do

        return $next($request);
    }
}

配置过滤参数

需要我们配置好白名单网址和白名单IP,在.env配置文件中增加以下配置:

代码语言:javascript
复制
[FILTER]
HOST = localhost,127.0.0.1,abc.com
IP = 127.0.0.1,192.168.0.253

中间件逻辑

to do中实现过滤来源网址逻辑,失败时返回错误Json。

代码语言:javascript
复制
//来源网址
$origin = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_ORIGIN'] : '';
if($origin != '') {
	$list = env('filter.host', '');
	$lists = explode(',',$list);
	for ($i = 0;$len = count($lists),$i < $len;$i++) {
		if(strpos($origin,$lists[$i]) !== false) {
			$flag = true;
			break;
		}
	}
}
if(!$flag) {
	return json(["errorCode" => 9998,"errorMessage" => '请求来源不正确']);
}

再进一步,增加来源IP判断

代码语言:javascript
复制
//来源IP
$ip = '';
if(isset($_SERVER["HTTP_CLIENT_IP"])) {
	$ip = $_SERVER["HTTP_CLIENT_IP"];
}
else if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
	$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
else if(isset($_SERVER["REMOTE_ADDR"])) {
	$ip = $_SERVER["REMOTE_ADDR"];
}
if(filter_var($ip,FILTER_VALIDATE_IP)) {
	$list = env('filter.ip', '');
	$lists = explode(',',$list);
	for ($i = 0;$len = count($lists),$i < $len;$i++) {
		if(strpos($ip,$lists[$i]) !== false) {
			$flag = true;
			break;
		}
	}
}

整个中间件逻辑代码如下:

代码语言:javascript
复制
public function handle($request, \Closure $next)
{
	$flag = false;
	//来源网址
	$origin = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_ORIGIN'] : '';
	if($origin != '') {
		$list = env('filter.host', '');
		$lists = explode(',',$list);
		for ($i = 0;$len = count($lists),$i < $len;$i++) {
			if(strpos($origin,$lists[$i]) !== false) {
				$flag = true;
				break;
			}
		}
	}
	if($flag) {
		//来源IP
		$ip = '';
		if(isset($_SERVER["HTTP_CLIENT_IP"])) {
			$ip = $_SERVER["HTTP_CLIENT_IP"];
		}
		else if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
			$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
		}
		else if(isset($_SERVER["REMOTE_ADDR"])) {
			$ip = $_SERVER["REMOTE_ADDR"];
		}
		if(filter_var($ip,FILTER_VALIDATE_IP)) {
			$list = env('filter.ip', '');
			$lists = explode(',',$list);
			for ($i = 0;$len = count($lists),$i < $len;$i++) {
				if(strpos($ip,$lists[$i]) !== false) {
					$flag = true;
					break;
				}
			}
		}
	}
	if(!$flag) {
		return json(["errorCode" => 9998,"errorMessage" => '请求来源不正确']);
	}
	return $next($request);
}

控制器使用

如果所有控制器都需要使用这个中间件过滤,则在`app\middleware.php`中增加:

代码语言:javascript
复制
\app\middleware\Filter::class

如果只有需要的控制器才使用这个中间件过滤,则可以在需要的控件器类中增加:

代码语言:javascript
复制
//此类使用中间件
protected $middleware = [Filter::class];
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建中间件
  • 配置过滤参数
  • 中间件逻辑
  • 控制器使用
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档