使用 realpath() 校验绝对路径是防止目录穿越攻击的标准做法。核心逻辑是将用户提供的相对路径转换为服务器上的绝对物理路径,然后检查该路径是否位于指定的安全根目录下。如果转换后的路径不在允许范围内,则拒绝下载请求。

如何验证文件存在于指定目录中
通过比较 realpath() 返回的完整路径与目标根目录的前缀来实现。只要文件的实际存储位置以根目录字符串开头,就证明它在允许的范围内。

<?php $root = '/var/www/files';
$userInput = '../etc/passwd';
$fullPath = realpath($root . '/' . $userInput);
if (strpos($fullPath, $root) !== 0) {
die('Access Denied');
}
// 继续处理下载逻辑
?>
如何处理符号链接导致的越权访问
当目录中存在指向外部位置的符号链接时,realpath() 会解析这些链接并返回最终的真实路径。这确保了即使攻击者利用软链接试图跳出沙箱,系统依然能识别其真实的物理位置并进行拦截。

<?php $safeDir = '/var/www/safe';
$linkPath = $safeDir . '/link_to_outside';
$resolved = realpath($linkPath);
// 若 resolved 不在 safeDir 下,则被拦截
if (strpos($resolved, $safeDir) !== 0) {
echo 'Blocked symlink traversal';
} else {
echo 'Allowed';
}
?>
当输入包含不存在的文件时会发生什么
如果用户输入的文件在磁盘上根本不存在,realpath() 将返回 false。此时必须显式检查返回值,否则后续的路径比对操作可能会因为类型错误而失效或产生不可预知的行为。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











