PHP 8.1默认禁用allow_url_include=Off,需确认关闭以防范RFI和伪协议利用;应同步关闭allow_url_fopen、限制open_basedir、禁用危险函数、杜绝动态路径拼接,并加强日志与WAF防护。

关闭危险的PHP配置项
PHP8.1默认已禁用allow_url_include,但若手动开启或旧配置残留,远程文件包含(RFI)和部分伪协议(如data://、php://input)就可能生效。必须确认该选项为Off:
- 编辑
php.ini,设置allow_url_include = Off - 同时建议关闭
allow_url_fopen = Off,避免间接辅助利用 - 重启Web服务使配置生效,并用
phpinfo()或ini_get('allow_url_include')验证
限制伪协议访问范围
PHP8.1对php://filter等协议做了更严格的上下文约束,但仍需主动拦截非必要使用场景:
- 在
open_basedir中明确限定可读目录,使php://filter无法读取敏感路径外的源码 - 通过
disable_functions禁用file_get_contents、readfile等常被配合利用的函数(注意不影响业务逻辑) - 对所有含
php://、data://、expect://等协议头的输入做前置拦截——不是靠正则过滤,而是拒绝含协议标识的路径参数
杜绝动态拼接路径的写法
伪协议能起效,根本前提是用户输入直接进了include或require。PHP8.1不改变这一逻辑,防御核心仍是代码层收敛:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 禁止
include($_GET['file'])、require($user_input . '.php')这类写法 - 改用白名单映射:例如
$pages = ['home' => 'home.php', 'about' => 'about.php']; include $pages[$_GET['page']] ?? '404.php'; - 若必须支持多语言/模板切换,把路径固化在配置数组中,不接受任意字符串
增强运行时监控与日志审计
即使做了上述限制,仍需覆盖绕过可能性。PHP8.1支持更细粒度的错误与流操作日志:
立即学习“PHP免费学习笔记(深入)”;
- 开启
log_errors = On,并配置error_log记录所有E_WARNING和E_COMPILE_ERROR,特别关注include失败时暴露出的物理路径 - 在Web服务器层(如Nginx)用
if规则拦截含php://、data://、file://等协议的请求参数 - 部署WAF规则,识别常见伪协议载荷特征(如
php://filter/read=convert.base64-encode/resource=)并实时阻断


















