我有一个简单的网站,允许用户上传文件(显然还有其他内容)。我正在教自己php / html。
目前该网站具有以下特征: - 当用户注册时,会在其名称中创建文件夹。 - 用户上传的所有文件都放在该文件夹中(在名称中添加了时间戳,以避免重复出现任何问题)。 - 上传文件时,有关它的信息存储在SQL数据库中。
简单的东西。
所以,现在我的问题是我需要采取哪些步骤:
注意:
我认为B会自动实现A.我可以限制用户只上传带有.doc和.docx扩展名的文件。这足以拯救C吗?我不会假设。
答案 0 :(得分:1)
您想要做很多事情,而且您的问题非常广泛。
对于Google索引,您可以使用/robots.txt。您没有指定是否还要将ACL(访问控制列表)应用于文件,因此可能或可能不够。通过脚本提供文件可能会有效,但您必须非常小心不要使用include,require或类似的东西来执行代码。您想要打开文件,阅读它并通过文件操作原语提供它。
阅读“路径遍历”。你想在上传和下载中避免这种情况(如果你以某种方式提供文件)。
“恶意文件”的定义相当广泛。恶意谁?例如,如果你担心你的一方被用来分发恶意软件(你应该),你可以在uplaod上运行防病毒软件。如果你想确保人们不会损害服务器,你至少要确保他们只能上传一堆文件类型。检查扩展和mimetype是一个开始,但不要相信(你可以在png中嵌入代码,如果它通过include()包含它是有效的)。 然后是XSS的问题,如果用户可以上传HTML内容或被解释为这样的东西。确保提供内容处置标头和非HTML内容类型。
这是一个开始,但正如你所说,还有更多。
答案 1 :(得分:0)
如果一个人设法上传一个.php
扩展名的文件(或导致服务器端脚本/处理的其他扩展名),那么您最大的威胁就是。文件中的任何代码都在您的服务器上运行,具有Web服务器具有的任何权限(因配置而异)。
如果上传的最终结果只是您希望能够将文件作为下载提供(而不是让某人直接在浏览器中查看它们),那么您可以将下载存储在非可通过Web访问的目录,并通过强制下载的脚本提供文件,无论扩展名如何,都不会尝试执行任何操作(参见http://php.net/header)。
这也使得只有在一个人登录时才允许下载更容易,而在此之前,你需要一些.htaccess
魔法来实现这一点。
答案 2 :(得分:0)
如果您不希望文件可用,则不应上传到支持Web服务器的目录。
我建议您使用X-Sendfile,它是指示服务器向用户发送文件的标头。你的PHP脚本名为'fetch so-and-so file',你可以进行任何身份验证(我假设你已经有了),然后返回标题。只要Web服务器可以访问该文件,它就会为该文件提供服务。