首页 文章

保护PHP站点中的文件

提问于
浏览
3

我有一个网站接受用户上传的文件(图像,pdf,word文档等),然后允许其他用户下载它们 .

我意识到这会带来安全风险,因为恶意用户可以上传伪装成有用文件的脚本等 .

我的问题是 - 是否足以检查使用PHP(mime_content_type或finfo)上传的文件的mime类型并将文件设置为只读(不可执行),或者我还必须将上传的文件存储在目录中那是在网络根目录之外?我认为这将消除上传文件的大部分风险,但我不确定 . 在这种情况下,无法对上载的文件执行病毒扫描 .

谢谢你的意见 .

3 回答

  • 1

    通常的做法是将文件上传到文档根目录之外,并且通常使用随机化的文件名,然后将其映射到数据库中的正确项目/对象/帖子 . 如果需要其他权限来访问文件,请确保在允许下载之前检查它们,当然,您只有经过身份验证的用户才能上传 .

    Fileinfo finfo_ 对于验证大多数mimetypes很有用,至少可以验证名为".txt"的东西实际上是文本文件而不是二进制blob,或者".jpg"实际上看起来是基于其前几个或最后几个字节的jpeg . 它可能需要一些额外的工作来整理MS Office mimetypes,就好像我没记错,它们都是application-msword . 但是,您可以使用文件扩展名来确定它应该是什么(xls,ppt,doc等) .

    然后,PHP脚本提供下载的文件,而不是直接提供它的Web服务器 . 因此,您应该将mime类型与它一起存储,以便您可以提供适当的 Headers .

    header("Content-type: application-whatever");
    header("Content-length: size-of-the-file-in-bytes");
    
  • 1

    我会检查文件的mime类型,但我不会依赖于此 . 即使文件是完整的 .gif 并且在其id3标签中包含注释,这是一个php,它可以是executed with a local file include . 更安全的方法是使用 long blob 数据类型在数据库中存储文件 . 然而,这种开销是垃圾 .

    The best solution 从安全性,可伸缩性和perforce的角度来看,将使用像CouchDB这样的无sql数据库 .

    要记住一些事情,不要相信 $_FILES[] . $_FILES['type'] 可能是攻击者想要的任何内容,因此从安全角度检查它是没有意义的 . 并且 $_FILES['name'] 可能有令人讨厌的输入,如 ../../../ . 最好将文件重命名为主键,然后将关于该文件的信息存储在关系数据库(如mysql)中 .

  • 1

    我建议您使用所有工具来测试文件类型 . 但是要知道黑客可以通过其他方式植入危险文件 .

    最好的办法是将文件上传到不同的 server . 一个只能托管文件的人 .

相关问题