ThinkPHP如何设置请求来源验证_请求来源验证配置【安全】

夏辰酱_2264

夏辰酱_2264

2026-06-18

271人浏览

原创

必须绕过默认$_server取值逻辑,结合可信代理、host解析、ua/referer校验、自定义头验证及source_tag日志组合实现多维请求来源识别与防护。

thinkphp如何设置请求来源验证_请求来源验证配置【安全】

如果您在 ThinkPHP 应用中需要识别并校验请求的真实来源,防止伪造 Referer、恶意 UA 或非法子域名调用,则必须绕过默认的 $_SERVER 取值逻辑,结合反向代理环境与可信头字段进行多维验证。以下是实现请求来源验证的具体配置与操作步骤:

一、配置可信代理并获取真实客户端 IP

直接读取 $_SERVER['REMOTE_ADDR'] 在 CDN、Nginx 反向代理或容器部署下会返回网关地址而非真实用户 IP,必须通过 X-Real-IP 或 X-Forwarded-For 头配合可信代理白名单提取。ThinkPHP 的 request()->ip() 方法已内置代理处理逻辑,但默认仅信任 127.0.0.1 和 ::1,线上需显式声明内网段。

1、打开 config/app.php 文件,在数组中添加或修改 trusted_proxies 配置项;

2、将实际部署环境中的负载均衡器、CDN 回源网段填入,例如:'trusted_proxies' => ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'];

3、确保 Nginx 配置中已设置 proxy_set_header X-Real-IP $remote_addr;,且未允许前端透传该头;

4、在业务代码中统一使用 $this->request->ip() 获取真实 IP,禁用 $_SERVER['REMOTE_ADDR']。

二、通过 Host 与子域名识别业务来源

域名是区分租户、站点或调用方身份的关键标识,但直接解析 HTTP_HOST 易受伪造和代理干扰。ThinkPHP 提供 request()->host() 和 request()->subDomain() 方法,其可靠性依赖于 url_domain_deploy 配置及 Host 头透传完整性。

1、启用子域名解析:在 config/app.php 中设置 'url_domain_deploy' => true;

2、若需手动提取主域或二级域(如 api.example.com → example.com),调用 $this->request->host() 后用 PHP 字符串函数切分,避免正则误判;

3、本地开发时,浏览器不支持 sub.localhost,须在 hosts 文件中绑定真实测试域名(如 127.0.0.1 api.test.com);

4、禁止在控制器中使用 $_SERVER['HTTP_HOST'] 拼接协议生成跳转 URL,应改用 $this->request->domain()。

三、提取并校验 User-Agent 与 Referer 头

User-Agent 可识别调用终端类型(小程序、APP、浏览器、curl),Referer 则用于判断是否来自可信页面跳转。二者均属客户端可控字段,不可作为唯一认证依据,但可用于辅助标记与灰度分流。

1、在中间件中调用 $this->request->header('user-agent') 获取原始 UA 字符串;

2、使用 strpos() 或正则匹配关键词,例如检测微信小程序:stripos($ua, 'miniProgram') !== false;

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

3、对 Referer 进行白名单校验:先检查 $this->request->header('referer') 是否非空,再比对是否以预设域名开头(如 https://admin.example.com);

4、禁止将 Referer 直接写入日志或响应体,防止反射型 XSS,需先 htmlspecialchars($referer, ENT_QUOTES, 'UTF-8') 转义。

四、注入自定义来源标识头并强制校验

第三方系统调用 API 时,应在请求头中携带唯一标识(如 X-App-ID、X-Client-Type),服务端通过中间件统一提取、格式校验与白名单比对,拒绝无标识或非法标识的请求。

1、新建中间件 app/middleware/SourceHeaderCheck.php;

2、在 handle() 方法中调用 $this->request->header('x-app-id') 获取应用 ID;

3、校验其是否为 UUID 格式:filter_var($appId, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i']]);

4、查询数据库或配置文件确认该 App ID 是否启用且归属有效租户,失败则抛出 HttpException(403);

5、将校验结果存入请求属性:$request->withAttr('source_app_id', $appId),供后续控制器使用。

五、组合生成 source_tag 并写入访问日志

单一维度不足以准确刻画请求来源,应将 IP、UA 类型、Referer 域名、自定义头等字段组合为结构化标签(source_tag),统一记录至日志,支撑审计与溯源。

1、在 SourceHeaderCheck 或独立追踪中间件中构造标签字符串,例如:sprintf('%s-%s@%s', $clientType, $appVersion, $realIp);

2、对公网 IP 执行脱敏处理:preg_replace('/\.\d+$/','.*', $realIp);

3、截断过长 UA 字符串,限制长度不超过 255 字符:mb_strimwidth($ua, 0, 255, '...', 'UTF-8');

4、将 source_tag 写入日志上下文:$this->log->record(['source_tag' => $tag]);

5、确保日志配置中已关闭敏感头字段(如 Authorization、X-API-Key)的自动记录,防止密钥泄露。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

thinkphp php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10964

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6401

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2155

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4048

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4754

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3731

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5337

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4182

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12102

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程