PHP文件上传/下载安全性

时间:2012-06-15 03:00:59

标签: php security .htaccess upload download

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

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

让我们调用我的服务器路径/path 我的网站文件位于/path/mysite
当用户上传文件时,我会将其移至/path/uploads/file_name 某人无法通过网址访问该文件夹 要添加,我在/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);

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

我需要处理哪些安全漏洞?

2 个答案:

答案 0 :(得分:1)

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

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

我的第三个建议提到了Marc B提出的观点,你需要考虑对你想要/支持的文件名和文件类型的限制,以及其他攻击的可能性。一种方法是简单地存储具有文件名和升序ID的文件,并将ID /用户文件名保存为DB表中的映射。您还需要考虑对服务器的攻击,但恶意用户可以使用此上传工具来实施XSS和其他攻击。

答案 1 :(得分:-1)

您可以使用

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

php_flag引擎关闭

在.htaccess中。这应该可以为您在 目录中运行的内容提供很好的保护。

但是,你没有显示你的上传代码,因此很难说你在那里做了什么:你真的想检查一下你是否容易受到路径遍历的攻击,因为这样会完全取消你的保护。

下载代码也可能容易受到攻击:如果您实际使用的是您发布的代码段,攻击者只需使用“../../whatever.php”作为文件名即可下载应用程序中的任何文件(再次,路径遍历)。或者将该脚本用作praxy等等 - 因此您需要确保验证文件名值。