
在Web应用开发中,PHP因灵活的动态加载机制而广泛应用,但这一特性也带来文件包含(File Inclusion)及服务器端请求伪造(Server-Side Request Forgery,简称SSRF)两类典型安全风险。深入理解其成因、利用方式及防护策略,对构建安全的PHP系统至关重要。
文件包含漏洞
文件包含漏洞源于PHP的include、require等函数在处理用户输入路径时缺乏严格校验,攻击者可借此加载非预期文件,实现敏感信息泄露、代码执行甚至服务器控制。根据路径来源可分为本地文件包含(LFI)与远程文件包含(RFI)。
产生原因多为直接拼接用户可控参数作为文件路径,例如:
<?php $file = $_GET['page']; include($file . '.php'); ?>
当攻击者构造URL为?page=../../etc/passwd%00时,可绕过扩展名限制读取系统敏感文件;若allow_url_include启用且未过滤远程地址,还可执行远程恶意脚本。
防护要点包括:避免将用户输入直接用于文件操作;采用白名单限定可包含文件范围;禁用allow_url_include;使用绝对路径并配合文件存在性与类型校验。
SSRF漏洞
SSRF指服务端在处理请求过程中,未对目标地址进行充分验证,导致攻击者诱使服务器向内部或受限网络发起非预期请求。PHP中常见触发场景包括调用file_get_contents、curl、fopen等函数访问外部资源。
示例风险代码如下:
<?php $url = $_POST['url']; echo file_get_contents($url); ?>
攻击者可将url设为内网地址如http://127.0.0.1:3306探测数据库服务,或http://192.168.1.10/admin扫描管理接口,进而实施内网渗透。
防护措施包括:对输入URL进行协议与域名白名单校验,禁止访问私有IP段(如10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)及localhost;限制可访问端口范围;使用DNS重绑定防护技术;必要时通过中间代理隔离直接请求。
综合防护建议
文件包含与SSRF本质均为未严格校验外部输入导致的服务端行为失控。开发阶段应坚持最小权限原则,以白名单为核心控制策略,结合严格的输入过滤与输出编码。同时,定期审计依赖组件版本,及时修补已知漏洞,并通过自动化安全测试工具覆盖关键逻辑路径,可有效降低此类风险发生概率。