【问题标题】:lots of files tactics have directory traversal security problem?大量文件策略有目录遍历安全问题?
【发布时间】:2009-06-11 15:30:38
【问题描述】:

如果我选择大量文件策略,
然后我变成了有目录
遍历安全问题?

我需要写登录系统,
和大量的文件策略意味着

制作大量的 id 文件并使用 扫描目录。

所以目录会有

aaa.txt(内容为 aaa_pass)
bbb.txt(内容为 bbb_pass)
ccc.txt(内容为ccc_pass)

当有人输入他的 id 时,
系统scandir目录,
然后找到id文件。

但是,嘿,如果他输入为

"../../important.txt" ?

那么他可以访问 ../../important.txt 吗?

【问题讨论】:

    标签: php security login directory traversal


    【解决方案1】:

    乍一看,您似乎正在走一条有点奇怪的路径来编写登录系统。我不确定文件系统上目录中的纯文本文件是否是明智的选择,如果没有其他原因只是它异常并且您可能会忽略在更常见的身份验证中已经考虑过的许多细微之处系统。例如,如果您想存储散列和加盐的密码,您需要考虑如何在您的方案中实现它,并且您可能会犯一个会导致安全问题的错误。不过,使用一个好的 PEAR 库,甚至 Zend Framework 中的 Zend_Auth 组件,将为您提供一个清晰且有据可查的起点。

    无论如何,假设您有您在问题中描述的安排的理由,那么在这种情况下,basename() 函数可能就是您想要的。它会剥离除文件名本身之外的所有内容,以便他们无法像您在问题中描述的那样进行目录遍历攻击。

    所以如果用户的输入是:

    ../../重要

    你可以运行:

    $cleanUsername = basename($input);
    $filename      = '/path/to/password/files/' . $cleanUsername . '.txt';
    
    if (file_exists($filename)) {
        [...]
    }
    

    有意义吗?

    【讨论】:

    • 啊....我需要消毒吗?并且它意味着很多文件策略存在目录遍历安全问题?
    • 在用户的输入上调用 basename() 将阻止他们从其他目录读取文件,因此绝对需要一定程度的清理,是的。只要您确保用户名符合操作系统中文件名安全的字符子集(字母数字可能是一个安全的选择,如果需要,可能包括下划线),这应该是您真正需要的。您只需获取输入,通过 basename() 传递它,然后遍历文件以查看是否存在匹配的文件。
    【解决方案2】:

    您可以在将用户名用作路径的一部分之前对其进行一些验证 - 例如,只允许字母和数字,您可以使用正则表达式执行类似的操作:

    if (!preg_match('/^[a-zA-Z0-9]+$/', $username)) {
        //username is not valid
    } else {
        //username is ok to use
    }
    

    另一种方法是在读取或写入之前对用户名进行哈希处理,例如:

    $hash = sha1($username);
    

    这样,用户可以使用任何东西作为他们的用户名,并且不会有他们操纵文件查找行为的危险。 "../../important.txt" 的用户名会给你一个 "48fc9e70df592ccde3a0dc969ba159415c62658d" 的哈希值,尽管源字符串很讨厌,但它是安全的。

    【讨论】:

      【解决方案3】:

      如果您别无选择,只能使用此文件密码系统​​(假设您出于某种原因必须这样做),除了创建某种混淆文件名之外,您可能还希望创建具有相同扩展名的文件作为您的服务器端语言以防万一 - 例如,如果您使用 PHP,您的文件名将是 john.php(或混淆的“john”),内容可能是这样的:

      <?php
          exit; // or maybe even a header redirect --
          /*password goes here*/
      ?>
      

      当然,您的文件读取例程需要解析我们在注释块中的短语。

      这样,如果有人确实以某种方式到达了该文件,它将永远不会呈现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-11
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        相关资源
        最近更新 更多