【问题标题】:PHP file upload/download securityPHP文件上传/下载安全
【发布时间】:2012-06-18 03:14:01
【问题描述】:

我只是想确认我正在做的事情实际上是安全的。

首先,我有一个 GoDaddy 共享主机帐户,但我有一个专用 IP 地址。

让我们调用我的服务器路径/path
我网站的文件位于/path/mysite
当用户上传文件时,我将其移至/path/uploads/file_name
某人不可能通过 URL 访问该文件夹。
要补充的是,我在/path/uploads 中有一个 .htaccess 文件,其中包含以下内容:

order deny,allow
deny from all
allow from 1.1.1.1 #let's say 1.1.1.1 is my server's IP address.

然后要真正开始下载文件,我的用户将点击指向mysite.com/file.php?q=[file_id]的链接

file.php,我是这样下载的:

$mime = mime_content_type($location);
header('Content-disposition: attachment; filename='.$name);
header('Content-type: '.$mime);
readfile($location);

据我所知,任何人上传的文件都不可能在我的服务器上运行,但我可能错了。

我是否需要处理任何安全漏洞?

【问题讨论】:

  • 如果您的文档根目录是 /path/mysite 并且您的上传文件夹是 /path/uploads 则它无法通过 url 访问,php 始终可以访问这些文件,因此只需要 deny from all。还要检查名为 .htaccess 的上传
  • 您可能还可以向 .htaccess 添加一些声明,例如 Options -ExecCGI,这可能会有所帮助,具体取决于您希望上传和下载的文件类型。这可能有助于扩展您的问题并说出您认为用户上传和下载哪种文件是合理的,以便我们更好地了解可以轻松防范哪些类型的文件。
  • 此外,同样取决于您在做什么,调整 /path/upload 目录的权限可能是明智之举。
  • GoDaddy 的主机很糟糕,更难找到更好的主机
  • 如果$location 只是$_GET['q'],那么用户可以抓取您服务器上的任何文件。

标签: php security .htaccess upload download


【解决方案1】:

首先,您不需要allow from 1.1.1.1,因为这将允许您通过 Apache 服务访问此目录。不,您只能从正在执行的程序/脚本中访问此目录。

其次,这是一个非常标准的模板来解决这类问题。因此,它非常值得一看且被广泛使用的软件包(例如 MediaWiki 或 BB 引擎(例如 phpBB))接近这一点并反映了它们的一些安全检查。

我的第三个建议借鉴了 Marc B 的观点,您需要考虑您希望允许/支持的文件名和文件类型的限制,以及其他攻击的可能性。一种方法是简单地使用文件名和升序 ID 存储文件,并将 ID/用户文件名作为映射保存在数据库表中。您还需要考虑不仅对您的服务器的攻击,而且恶意用户可以使用此上传工具来实施XSS 和其他攻击。

【讨论】:

  • 1.我删除了allow from。 2. 我会检查这些。 3. 我希望对可以上传的内容没有任何限制。当我存储文件时,我为它们分配了一个 ID。我将 ID 和文件名存储在 MySQL 数据库中。然后当有人去 /file/?q=[file_id] 我查询数据库以找到与文件 ID 匹配的文件名。而且我真的不知道有人如何进行XSS 攻击,因为除了下载之外,用户无法访问这些文件。
【解决方案2】:

您可以完全禁用该目录的 PHP 解释器

php_flag 引擎关闭

在您的 .htaccess 中。这应该可以很好地防止在 那个 目录中运行的东西。

但是,您没有显示您的上传代码,因此很难判断您在那里做什么:您确实想检查您是否容易受到路径遍历的影响,因为这会完全使您的保护失效。

下载代码也可能存在漏洞:如果您实际使用的是您发布的 sn-p,攻击者只需使用“../../whatever.php”作为文件名(同样,路径遍历)。或者将该脚本用作 proxy 等等 - 因此您要确保验证文件名值。

【讨论】:

  • 抱歉,php_flag 仅在 PHP 在 mod_php 下运行时才有效。 Godady 共享服务没有。但我同意必须在该目录中全部拒绝
  • 最好按照我上面的建议在 Apache 中将几种已知脚本文件类型的 mime 类型设置为 text/plain,这样它就只是回显源代码而不是直接执行。
  • PHP 只会执行一组 mime 类型,我看不出设置 text/plain 有什么帮助。 TerryE 你是对的,不知道 godaddy 不是 mod_php(CGI,坏主意)。/\
猜你喜欢
  • 2013-10-18
  • 2011-02-03
  • 2011-04-27
  • 1970-01-01
  • 2013-11-14
  • 2012-04-14
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
相关资源
最近更新 更多