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

PHP中防止目录遍历攻击的关键是严格过滤用户输入的文件路径,避免其通过../跳转到非预期目录。这类攻击常出现在文件下载、图片读取或日志查看等功能中,攻击者利用相对路径访问系统敏感文件(如/etc/passwd)。以下是几种有效防护方法。
用户传入的路径中不应包含..、//、等危险字符。使用str_replace或正则表达式清除或拒绝这些内容:
$userPath = str_replace(['../', '..\'], '', $userPath);或更严格地只允许字母、数字和特定符号:
$userPath = preg_replace('/[^a-zA-Z0-9._-/]/', '', $userPath);
但注意:仅靠过滤不够,仍可能被绕过,需结合其他措施。
通过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()会解析../和符号链接,得到真实路径。再判断该路径是否以合法根目录开头,防止跳出限制范围。
不允许用户输入以/或C:开头的路径,强制相对应用内部目录:
N世界
一分钟搭建会展元宇宙
138
查看详情
if (preg_match('/^[/\\]|[a-zA-Z]:[\\\/]/', $userFile)) {
die('不允许使用绝对路径');
}
同时可设定白名单目录,只允许访问预定义的几个子目录。
最安全的方式是不让用户直接传路径。例如用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接口与使用