在 PHP 中维护目录完整性:在允许路径的同时防止目录遍历
在 Web 开发领域,保护用户输入免受恶意尝试是非常重要的最重要的。在 PHP 中处理路径时,特别是在容纳相对路径的同时尝试限制目录遍历时,就会出现这样的问题。
考虑以下场景:您有一个基本路径“/whatever/foo/”并且想要允许用户使用 $_GET['path'] 指定相对于它的路径。但是,您必须防止它们利用漏洞,例如访问目标目录之外的文件。
在用户提供的路径中搜索“...”和“..”等序列的传统方法是不够的,因为它们可以被绕过。幸运的是,存在更强大的解决方案。
通过 realpath() 利用真实路径
要在允许相对路径的同时有效防止目录遍历,请考虑使用 realpath()。该函数将给定路径解析为其绝对物理位置,并考虑符号链接“.”。和“..”引用,以及其他虚拟目录。
以下代码片段说明了这种方法:
$basepath = '/foo/bar/baz/'; $realBase = realpath($basepath); $userpath = $basepath . $_GET['path']; $realUserPath = realpath($userpath); if ($realUserPath === false || strpos($realUserPath, $realBase) !== 0) { //Directory Traversal! } else { //Good path! }
首先,通过将 realpath() 应用于基本路径来获得 $realBase ,确保它准确反映其物理位置。接下来,通过连接基本路径和用户提供的路径来确定 $realUserPath,然后使用 realpath() 解析其实际物理路径。
至关重要的是,我们将 $realUserPath 与 $realBase 进行比较。如果 $realUserPath 等于 false(表示路径无效或不存在),或者不以 $realBase 开头,则识别为目录遍历尝试。相反,如果 $realUserPath 以 $realBase 开头,则表示允许的路径。
通过使用 realpath(),您可以获得一种可靠的方法来防止目录遍历,同时允许 PHP 中的相对路径,有效保护您的应用程序免受恶意攻击输入并保持目录结构的完整性。
以上是PHP 如何在允许相对路径的同时防止目录遍历?的详细内容。更多信息请关注PHP中文网其他相关文章!