信息发布→ 登录 注册 退出

php如何防止目录遍历攻击_php过滤路径中的..与限制根目录访问方法

发布时间:2025-11-27

点击量:
防止目录遍历攻击的关键是严格过滤并验证用户输入的文件路径。1. 过滤 ../ 和特殊字符,使用 str_replace 或正则清理输入;2. 利用 realpath() 规范化路径并校验其是否位于安全目录内;3. 禁止绝对路径输入,限制访问范围;4. 优先使用文件ID映射代替直接路径传递。核心是不信任用户输入,确保最终路径在预设范围内。

php如何防止目录遍历攻击_php过滤路径中的..与限制根目录访问方法

PHP中防止目录遍历攻击的关键是严格过滤用户输入的文件路径,避免其通过../跳转到非预期目录。这类攻击常出现在文件下载、图片读取或日志查看等功能中,攻击者利用相对路径访问系统敏感文件(如/etc/passwd)。以下是几种有效防护方法。

1. 过滤路径中的 ../ 和特殊字符

用户传入的路径中不应包含..//等危险字符。使用str_replace或正则表达式清除或拒绝这些内容:

$userPath = str_replace(['../', '..\'], '', $userPath);
或更严格地只允许字母、数字和特定符号:
$userPath = preg_replace('/[^a-zA-Z0-9._-/]/', '', $userPath);
但注意:仅靠过滤不够,仍可能被绕过,需结合其他措施。

2. 使用 realpath() 验证路径是否在安全目录内

通过realpath()将路径规范化,并检查其是否位于指定根目录下:

$baseDir = '/var/www/html/uploads/';
$userFile = $_GET['file'];
$fullPath = realpath($baseDir . $userFile);

if (strpos($fullPath, $baseDir) !== 0) {
    die('非法访问');
}

if (!$fullPath || !file_exists($fullPath)) {
    die('文件不存在');
}

readfile($fullPath);
说明: realpath()会解析../和符号链接,得到真实路径。再判断该路径是否以合法根目录开头,防止跳出限制范围。

3. 限制根目录访问,禁止绝对路径

不允许用户输入以/C:开头的路径,强制相对应用内部目录:

N世界 N世界

一分钟搭建会展元宇宙

N世界 138 查看详情 N世界

if (preg_match('/^[/\\]|[a-zA-Z]:[\\\/]/', $userFile)) {
    die('不允许使用绝对路径');
}
同时可设定白名单目录,只允许访问预定义的几个子目录。

4. 使用映射表或ID代替直接路径

最安全的方式是不让用户直接传路径。例如用ID对应文件:

$files = [
    1 => 'report.pdf',
    2 => 'image.jpg'
];

$id = (int)$_GET['id'];
if (!isset($files[$id])) {
    die('无效ID');
}

$filePath = '/safe/dir/' . $files[$id];
这样完全避免路径操纵风险。

基本上就这些。核心原则是:不信任用户输入,始终校验最终路径是否在允许范围内,优先使用间接引用方式。

以上就是php如何防止目录遍历攻击_php过滤路径中的..与限制根目录访问方法的详细内容,更多请关注其它相关文章!


相关文章: Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  React Router 嵌套组件中 URL 重定向问题的解决方案  优化Lar*el Docker镜像:Composer与PHP版本控制策略  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  CSS子选择器:如何区分并样式化嵌套列表的子层级  J*aScript:在map操作中高效处理空数组  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  HTML长属性值处理:表单action路径优化与代码规范应对  最新韩小圈网页版登录入口_官网在线观看官方链接  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  处理Kafka消息时会话超时与实现幂等性消费者  Go语言中Map值调用指针接收器方法的限制与应对  必由学官方网站入口 必由学学生教师共用登录通道  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  J*aScript 字符串标签转换:使用正则表达式高效替换  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  自动化J*a应用中GitHub CLI或REST API的认证与交互  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  不同用户不同价格! 索尼开启账户个性化定价测试  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  深入理解J*a合成构造器:何时以及为何阻止其生成  生成rdflib自定义SPARQL函数:参数匹配与实践指南  C++如何比较两个字符串_C++ string compare函数与操作符对比  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  Discord Slash 命令响应超时问题的异步解决方案  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  服务端验证_j*ascript输入检查  如何配置Composer的PSR-4自动加载_Composer自动加载命名空间映射实践教程  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  composer的"require-dev"部分是用来做什么的?  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  漫蛙官网正版漫画入口 漫蛙2官方网页登录地址  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  React Router v6 教程:构建认证保护的私有路由与重定向策略  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  微博网页版首页入口 微博电脑端官网登录链接  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  J*aScript中在Map循环中检测并处理空数组元素  响应式图片在网页设计中的正确实现方法  深入理解J*a链表中的IPosition接口与使用 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!