应先用parse_url()提取URL路径,再用pathinfo()获取扩展名,最后校验extension是否为预期值;需通过REQUEST_URI安全获取路径并解码,严禁依赖用户可控参数推导后缀。

当PHP脚本需要提取URL后缀(如 .php、.html)用于路由判断或文件类型识别时,若直接解析完整URL字符串却忽略查询参数部分,会导致误判——例如 index.php?file=report.pdf 被当成 .pdf 后缀处理,从而绕过预期的PHP执行逻辑或触发路径遍历风险。
先剥离查询参数再截取后缀
第一步:用 parse_url() 提取原始URL的路径部分,彻底丢弃 query 和 fragment。
第二步:对提取出的路径使用 pathinfo() 获取扩展名,避免手动用 strrpos() 或 substr() 截取——后者在含多个点的路径(如 /v1.api/users.profile.php)中极易出错。
第三步:显式检查返回的 extension 是否非空且为预期值(如 php),空值或非法扩展名应拒绝继续执行。
立即学习“PHP免费学习笔记(深入)”;
用 REQUEST_URI 安全获取当前路径
方法一:直接读取 $_SERVER['REQUEST_URI'],它只包含路径+查询字符串,不含协议和域名。
方法二:用 explode('?', $_SERVER['REQUEST_URI'], 2)[0] 快速分离路径部分——【注意:必须用 2 作 limit 参数,否则 ? 出现在路径中(如 /a/b?c=d)时会错误截断】。
方法三:调用 urldecode() 处理编码字符(如 %2E 对应点号),防止攻击者用编码绕过后缀校验。
禁止从 QUERY_STRING 中推导后缀
绝对不要用 $_GET、$_REQUEST 或 parse_str() 解析后的参数来决定文件后缀——这些数据完全由客户端控制,可被任意篡改。
例如,?ext=jpg 这类参数若被用于拼接 file.$_GET['ext'],将直接导致任意文件读取漏洞。
【关键前提:后缀判断必须基于服务器端真实请求路径,而非任何用户提交的参数】



















