登录
首页 >  文章 >  php教程

PHP防范目录遍历漏洞方法介绍

时间:2026-03-31 20:30:26 423浏览 收藏

本文深入剖析了PHP中目录遍历漏洞的成因与实战防御策略,指出file_get_contents、include、glob、scandir等常见函数在直接拼接用户输入路径时极易被利用(如通过../../etc/passwd、URL编码、多重点号等变体)突破目录限制,导致任意文件读取或敏感信息泄露;强调绝对不可依赖简单字符串过滤或basename()截取,而应坚持白名单校验、realpath()路径规范化+根目录比对、ID映射替代路径拼接、数据库驱动的上传文件访问机制,并警惕符号链接和伪协议等边缘风险——安全不是“用户不会乱填”的侥幸,而是从设计之初就切断用户输入与文件系统路径的直接关联。

PHP怎么防止目录遍历漏洞攻击【介绍】

PHP中file_get_contentsinclude直接拼路径为什么危险

因为用户可控的参数(比如$_GET['file'])一旦没过滤,就可能被构造为../../etc/passwd这类路径,绕过预期目录范围读取任意文件。PHP不会自动阻止向上跳转,file_get_contentsinclude照常执行——只要Web服务器进程有权限,就读得出来。

常见错误现象:Warning: include(): Failed opening '/var/www/html/../../etc/shadow' for inclusion 这类报错反而暴露了路径结构;更危险的是静默读取成功,返回敏感内容。

  • 绝对不要对用户输入做简单字符串替换(比如删..),攻击者可用....//%2e%2e%2f.\.\等变体绕过
  • 优先用白名单:只允许几个预设文件名,比如['help.md', 'changelog.txt'],匹配不上直接die()
  • 若必须支持动态文件名,先用realpath()解析完整路径,再检查是否落在允许根目录内(注意realpath()对不存在路径返回false,需提前判断)

basename()截文件名够不够安全

不够。它只去掉路径分隔符前的部分,但不解决编码绕过、空字节截断、符号链接等问题。比如index.php%00.jpg在旧版PHP里会被basename()当成index.php%00.jpg,而include()实际加载时%00截断后变成index.php

使用场景:仅适合已知路径安全、只需提取纯文件名的内部逻辑,不能用于防御。

  • basename()http://evil.com/xxx这种伪协议路径也返回xxx,毫无防护作用
  • 如果配合pathinfo()dirname再拼接,仍需校验拼接结果是否在白名单根目录下
  • 现代PHP(7.4+)默认禁用%00截断,但别依赖这个——老环境或配置不当仍可能触发

如何安全地提供用户上传的静态文件下载

核心是切断用户输入与文件系统路径的直接映射。不拼路径,改用ID查数据库,再关联到磁盘上带哈希前缀的固定路径。

性能影响:多一次数据库查询,但换来确定性安全;比反复realpath()+strpos()校验更可靠。

  • 上传时生成唯一$file_id,保存原始文件名到DB,物理路径存为/var/uploads/sha256($file_id)/xxx.pdf
  • 下载接口只接收$file_id,查DB确认归属和状态,再用预设根目录拼出物理路径
  • readfile()输出内容,设置Content-Disposition: attachment,避免浏览器直接渲染HTML/JS类文件
  • 务必关闭open_basedir外的目录访问,Apache/Nginx配置中限制DocumentRoot或用Location禁止访问/var/uploads/

为什么glob()scandir()也要小心

它们本身不读文件内容,但若把用户输入当目录名传进去,就等于帮攻击者列出/etc//home/下的文件列表,属于信息泄露。

容易踩的坑:以为“只是列目录,又不读内容”,却忽略了目录结构本身就是敏感信息(比如发现config_backup_2024.php就能猜到备份习惯)。

  • 传给glob()的模式字符串必须硬编码,不能含$_GET参数
  • 若需按条件筛选,先用白名单限定子目录名,再调用scandir()
  • Linux下符号链接可能指向外部目录,scandir()会照常列出,需配合is_link()readlink()二次校验

最麻烦的不是技术点,是开发时总想“这个参数用户不会乱填”,结果测试用?file=robots.txt没问题,上线后被人用Burp扫出?file=../.env——防御必须默认信任链断裂。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《PHP防范目录遍历漏洞方法介绍》文章吧,也可关注golang学习网公众号了解相关技术文章。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>