php - 代码的安全问题是什么?

  显示原文与译文双语对照的内容
0 0

几年前,我发答案为问题找到一种方法,在PHP,为了使用户传入URI的相对路径相关档案,并防止目录遍历。

我找到了一些评论说的代码不安全,和一些正在今天downvotes ( 最新) 。 下面是代码:

$path = $_GET['path'];
if (strpos($path, '../') !== false ||
    strpos($path, "..") !== false ||
    strpos($path, '/..') !== false ||
    strpos($path, '..') !== false)
{
    // Strange things happening.
}
else
{
    // The request is probably safe.
    if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . $path))
    {
        // Send the file.
    }
    else
    {
        // Handle the case where the file doesn't exist.
    }
}

我阅读了一遍又一遍,对程序进行测试的代码,但是仍然不能理解什么是安全问题也带来了。

只提示我挡了你的评论是, ../可以替换为 %2e%2e%2f. 这不是一个问题,因为PHP会自动将其转化为 ../.

到底什么问题这块代码? 请问是什么输入的值,而这些概念允许目录遍历或中断一些以某种方式?

时间:原作者:9个回答

0 0

我刚运行了你的代码通过 Burp入侵者,找不到任何办法可以找到它在这种情况下。

- 有可能是向下投票由于侵入防范other/old技术栈这部署了类似的方法通过黑名单某些字符组合。

如你提到,当前版本的PHP自动URL解码输入等技术,但是,已经有了缺陷,其中doubleURL编码( 点= %252e( 点),16位Unicode编码= %u002e),时间过长UTF 8 Unicode编码( 点= %c0%2e) 或插入空字节( %00) 找技巧筛选并允许服务器端代码来解释该路径作为未编码版本一旦响过一个拇指向上移动过滤器。

这就是为什么它提出了警钟响铃。 即使你的方法似乎在这里工作,通常它可能不是这样。 技术会不断变化和测试之前些总是注意和使用的技术则不受字符集解释尽可能例如使用已知良好的字符的白名单,很可能要总是好的,或使用文件系统函数( realpath 链接的回答中提到过),以验证实际路径是否是你希望得到的。

原作者:
0 0

有许多其他各种可能原因的名单通过,如:

.htaccess
some-secret-file-with-a-password-in-it.php

换句话说,任何目录或子目录中都可以访问,包括 .htaccess文件和源代码。 如果有什么不应该可下载,然后在该目录或其子目录的安全漏洞。

原作者:
0 0

我想不出在什么情况下这就会失败。

但是,我不知道PHP’s file_exists内部的实现以及它是否具有当前未知的一些这些问题。 就像 PHP空字节相关问题和几个文件系统函数直到PHP 5 .3 .4

所以小心翼翼,我宁愿要检查已解析路径而不是盲目地信任PHP和–可能更重要- 我假设,提到的四个序列是唯一可导致上面的路径指定的基目录。 这就是为什么我更想要 ircmaxell的解决方案

原作者:
0 0

黑名单是个坏习惯。 都是因为有一个白名单上的( 在允许的文本字符串或字符允许) 。

if(preg_match('/^[A-Za-z0-9-_]*$/', $path) ) {
    // Yay
} else {
    // No
}

或者另一种方法:

switch($path) {
    case 'page1':
    case 'page2':
        // ...
        break;
    default:
        $path = 'page1';
        break;
}
include $path;
原作者:
...