3

我只是想确认我所做的实际上是安全的。

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

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

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);

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

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

4

2 回答 2

1

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

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

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

于 2012-06-15T13:00:01.247 回答
-1

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

php_flag 引擎关闭

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

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

下载代码也可能容易受到攻击:如果您实际上使用的是您发布的代码片段,攻击者可以通过简单地使用“../../whatever.php”作为文件名(同样,路径遍历)。或者将该脚本用作 proxy 等等 - 因此您要确保验证文件名值。

于 2012-06-15T06:48:52.493 回答