PHP伪协议利用防御核心是禁用allow_url_include=Off和allow_url_fopen=Off,辅以白名单路径映射、open_basedir限制及日志监控,从配置层切断运行前提,而非仅依赖代码过滤。

PHP伪协议利用本身不依赖远程文件包含(RFI),但很多高危操作(如php://input、data://、expect://)的触发,往往与allow_url_include=On或allow_url_fopen=On强相关。因此,防御伪协议滥用,核心是切断其运行前提,而非仅靠代码层过滤。
关闭危险PHP配置项
这是最直接、最有效的底层防御手段。必须在php.ini中显式禁用:
-
allow_url_include = Off:禁用所有URL协议(含php://input、data://、http://等)用于include/require类函数 -
allow_url_fopen = Off:阻止fopen()、file_get_contents()等函数加载远程资源,同时削弱php://filter在部分组合场景下的危害放大能力 -
慎用
disable_functions:可考虑禁用system、exec、shell_exec、proc_open等执行函数,但需注意不影响业务正常调用
限制伪协议可用范围
并非所有伪协议都同等危险,应按需收缩暴露面:
-
php://filter无法被完全禁用,但它的读取行为(如convert.base64-encode)只在文件存在且可读时生效。配合open_basedir限制可读目录,能大幅压缩可探测路径 -
php://input和data://依赖allow_url_include,关掉即失效;expect://需单独安装扩展,生产环境应彻底卸载 -
phar://和zip://虽不依赖URL配置,但可通过disable_functions禁用phar_mount或限制上传类型来间接防控
代码层做减法,不信任任何动态路径
伪协议攻击常借道“用户可控路径+危险函数”组合。防御重点不是拦截某个协议名,而是消除路径可控性:
- 禁止将
$_GET、$_POST、$_REQUEST等直接拼入include/require参数 - 若必须动态加载,采用白名单映射:
$pages = ['home' => 'home.php', 'about' => 'about.php']; include $pages[$_GET['p']] ?? 'home.php'; - 对路径做绝对化处理并校验前缀:
realpath($user_path)后判断是否落在/var/www/app/includes/下,避免绕过
监控与日志强化
即使配置收紧,仍需主动发现异常尝试:
- 在Web服务器(如Nginx/Apache)或WAF规则中,匹配含
php://、data://、expect://、phar://等关键字的请求参数,记录并告警 - 审计PHP错误日志,关注
Warning: include(): Failed opening ...类报错——攻击者常通过报错泄露真实路径,为后续利用铺路 - 检查
access.log中高频出现%00、..%2f、重复./等可疑路径模式
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











