2012-06-11 88 views
1

我有一个简单的网站,允许用户上传文件(其中很明显)。我一直在教自己的PHP/HTML。保护上传的文件(php和html)

当前该网站有以下特征: - 当用户注册一个文件夹是在他们的名字创建。 - 用户上传的所有文件都放在该文件夹中(为了避免重复出现任何问题,将时间戳添加到名称中)。 - 上传文件时,有关该文件的信息存储在SQL数据库中。

简单的东西。

所以,现在我的问题是什么步骤,我需要采取:

  • 阻止谷歌从存档上传的文件。
  • 防止用户访问上传的文件,除非他们已登录。
  • 防止用户上传恶意文件。

注:

我会假设,B,会自动实现答:我可以限制用户只能上传与.doc和.docx的文件。这足以抵抗C吗?我会假设没有。

+0

要解决A和B,只需在提供上传文件之前进行身份验证(基于会话信息)即可。至于C,你首先需要定义“恶意”.... –

+0

好吧。所以我需要“认证”,有人可以指导我看看可能的样子。 – user187680

+0

你需要阅读[sessions](http://www.php.net/manual/en/intro.session.php)。但是,那么你需要使用会话几乎在动态网站上有用的任何东西! –

回答

1

有一些你想要做的事情,你的问题是相当广泛的。

  • 对于Google索引,您可以使用/robots.txt。您没有指定是否也希望将ACL(访问控制列表)应用于这些文件,因此可能会或可能不够。通过脚本提供文件可能会起作用,但您必须注意不要使用包含,需要或类似的东西来欺骗执行代码。您反而想要打开文件,读取它并通过文件操作基元提供它。

  • 阅读关于“路径遍历”。你想避免这种情况,无论是在上传和下载(如果你以某种方式提供文件)。

  • “恶意文件”的定义非常宽泛。对谁是恶意的?例如,如果您担心自己的身边被用来分发恶意软件(您应该),那么您可以在上面运行防病毒软件。如果你想确保人们不会伤害服务器,至少要确保他们只能上传一堆文件类型。检查扩展和mimetype是一个开始,但不要相信(你可以用png嵌入代码,如果它通过include()包含,它是有效的)。 然后是XSS的问题,如果用户可以上传HTML内容或被解释为这样的东西。确保提供内容处置标题和非HTML内容类型。

这是一个开始,但正如您所说的还有更多。

0

如果一个人设法上载带有.php扩展名(或导致服务器端脚本/处理的其他扩展名)的文件,您将面临最大的威胁。文件中的任何代码都会在服务器上运行,并具有Web服务器的任何权限(因配置而异)。

如果上传的最终结果只是您希望能够将文件作为下载提供服务(而不是让某人直接在浏览器中查看它们),那么您最好将下载内容存储在非网页可访问的目录,并通过强制下载的脚本来提供文件,并且不管尝试执行什么操作(请参阅http://php.net/header)。

这也使得只有在某人登录时才允许进行下载变得容易得多,而在此之前,您需要一些魔术来实现这一点。

0

如果您不希望文件可用,则不应该上传到Web服务器提供的目录。

我建议你使用X-Sendfile,它是一个指示服务器向用户发送文件的头文件。你的PHP脚本被称为“获取某某文件”,将执行你已有的任何身份验证(我假设你已经拥有了某些内容),然后返回标题。只要Web服务器可以访问该文件,它就会提供该文件。

看到这个问题:Using X-Sendfile with Apache/PHP