【问题标题】:Dangerous file types to avoid in file-sharing website文件共享网站中要避免的危险文件类型
【发布时间】:2011-11-25 11:15:09
【问题描述】:

我正在制作一个小型文件共享网站,用户可以在其中上传内容。最近有人上传了一个 PHP 脚本,可能是为了破坏该站点。这让我开始思考:我应该阻止用户上传哪些文件类型?我已经阻止了.exe 文件。还有哪些其他文件类型可能对我的网站或其用户造成损害?

This script can be viewed here.

【问题讨论】:

  • 对您的服务器有害与对您的用户有害有很大不同。您是只关心您的服务器,还是希望避免人们上传文件,这些文件被用户下载后会损害他们的机器?
  • 尝试上传文件到pastebin.com

标签: php upload


【解决方案1】:

不要将文件存储在可直接访问的位置 - 仅通过您控制的脚本提供访问权限。不要使用用户提供的文件名存储文件 - 使用您生成的文件名(最好的选择是将文件详细信息存储在数据库中,包括原始文件名,并使用该数据库记录的主键字段存储实际文件。

有了这两个,人们可以上传他们想要的任何东西,并且文件在您的服务器上被执行/解释的可能性为零,因为它永远不会处于可以执行/解释的位置。

【讨论】:

  • 我不太明白使用原始文件名提供文件的问题。我真的很喜欢通过脚本提供所有内容的建议,这绝对可以避免所有问题。
  • 好的。有人上传了nastyscript.php,而您的网站将其放置在网站上可公开访问的区域。他们只需在浏览器中点击“yourserver.com/uploads/nastyscript.php”,现在服务器就会愉快地执行他们上传的 PHP 脚本 - 允许任意(可能是恶意代码)运行。如果您将文件存储在站点的文档根目录之外,因此无法通过直接 url 访问它,并使用一些随机的文件名存储它,那么在浏览器中点击 url 就不可能导致服务器运行该文件。
  • 您可以很容易地提供文件,因此它似乎使用Content-Disposition: attachment; filename=nastyscript.php 具有原始文件名,但在您的服务器上,它只是文件12345
  • 我明白,文件名问题是如果您的服务器从上传的目录提供文件。我假设,使用提供文件的脚本,上传的文件不会被自己请求;可能存储在网站的目录结构之外。感谢您的澄清!
【解决方案2】:

看起来脚本在定义函数时被切断了,所以我无法弄清楚它在做什么。

但是,如果您操作正确,您应该在“上传的文件”目录中有一个 .htaccess 文件,其中包含:

Header set Content-Disposition "attachment"

这将确保访问该目录中的任何文件都会导致下载,并且该脚本不会运行。

(实际上更好的是让文件在webroot之外,并有一个“下载器”php脚本echoing文件内容)

【讨论】:

    【解决方案3】:

    该脚本可以委婉地描述为远程管理脚本。

    您应该始终使用白名单,而不是黑名单。不要“列举错误”,而是列出允许的文件类型并拒绝其他所有内容。

    此外,所有上传的文件都应该放在一个不运行 PHP 处理程序或任何其他脚本处理程序的目录中(例如,检查其他用 PHP 编写的内容管理系统在 .htaccess 中执行的上传操作目录)。

    将上传的文件放在一个单独的子域中也是一个好主意,该子域对主域的 cookie 没有任何访问权限,以避免尝试在与主站点相同的源上运行 JavaScript 代码的攻击(内容类型的白名单是不够的,因为已知某些浏览器会猜测内容类型并将非 HTML 文件视为 HTML)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 2014-08-20
      • 1970-01-01
      • 2015-03-17
      • 2018-01-05
      • 1970-01-01
      相关资源
      最近更新 更多