代码之家  ›  专栏  ›  技术社区  ›  Alec Smart

此代码方法中存在安全漏洞

  •  5
  • Alec Smart  · 技术社区  · 16 年前

    我想知道这种方法是否有任何安全缺陷。我正在写一段代码,允许用户上传文件和另一套下载这些文件。这些文件可以是任何东西。

    1. 用户上传文件(包括.php文件在内的任何文件),它被重命名为md5散列(扩展名被删除)并存储在服务器上。生成相应的mySQL条目。
    2. 试图下载该文件的用户使用say download.php下载发送md5文件的文件(使用原始名称)。

    有没有什么方法可以让任何人利用上述场景?

    6 回复  |  直到 16 年前
        1
  •  3
  •   Rithiur    16 年前

    首先,由于文件是通过PHP文件下载的(假设 readfile() 使用适当的头文件),您应该将文件放置在用户无法访问的位置。在apache服务器上,通常最简单的方法是将一个.htaccess文件放入upload目录,其中包含“deny from all”以防止外部访问。如果用户一开始无法从外部访问文件,那么就不必担心文件扩展名会带来麻烦(不过,出于存储目的重命名仍然是个好主意)

    其次,用散列来命名文件可能不是一个好主意,因为最终可能会发生冲突。如果两个文件恰好有相同的散列呢?更不用说,计算哈希有点慢,特别是对于更大的文件(如果是从文件内容而不是名称计算的话)。因为您将一个条目存储到数据库中,所以我假设您在那里有某种主键(比如自动递增字段)。我建议只使用该ID号作为存储的文件名,以避免冲突(如果您不知道,您可以通过 mysql_last_insert_id()

        2
  •  1
  •   janmoesen    16 年前

    如果可以的话 include / require 由于一个单独的洞,本地文件 和 散列是可预测的,那么是的。

        3
  •  1
  •   Crozin    16 年前

        4
  •  1
  •   symcbean    16 年前

    为了使下载按预期工作,您可能需要存储mime类型并在contentdisposition头中生成具有适当扩展名的文件名。这也意味着这些下载需要通过PHP进行中介(因此不能将它们放在open\u base\u dir之外)。

    你应该检查你的代码,看看是否有任何方式上传的文件可能包括在内。

        5
  •  0
  •   JonnyLitt    16 年前

    如果它是不同的扩展,不是默认的可执行文件,并有一个随机哈希到它,保证不会被利用。只需确保没有将PHP分配给扩展。

        6
  •  0
  •   asarfraz    16 年前

    推荐文章