php - 保护 PHP 站点中的文件

标签 php security mime-types

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

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

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

感谢输入。

最佳答案

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

Fileinfo finfo_ 可用于验证大多数 mime 类型,至少可以验证名为“.txt”的文件实际上是文本文件而不是二进制 blob,或者“.jpg”确实出现成为基于其前几个或最后几个字节的 jpeg。它可能需要一些额外的工作来整理 MS Office mimetypes,好像我没记错的话,它们都是以 application-msword 的形式出现的。但是您随后可以使用文件扩展名来确定它真正应该是什么(xls、ppt、doc 等)。

然后一个 PHP 脚本提供下载的文件,而不是网络服务器直接提供它。因此,您应该将 MIME 类型与其一起存储,以便您可以提供适当的 header 。

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

关于php - 保护 PHP 站点中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223033/

相关文章:

php - 拉维尔 |数据透视表,表名冲突

windows - 如何从 .cer 和 .key 获取 .pfx 文件?

rest - 我应该通过 HTTP Header 还是 Post body 作为 JSON 将凭据传递给 REST Api?

http - 应如何指定文档的响应内容类型以便跨浏览器一致地工作?

html - 找不到格式和 MIME 类型受支持的视频。这是什么意思,我该如何更改

java - 如何创建 "offline"Java MimeMessage?

php - 类似于 PL/SQL 中的 += 或 .= 的运算符?

php - 如何阻止 Google adsense 链接到我服务器上的文件?

php - 我需要在主类之前先在 symfony2 中创建接口(interface)吗

web-services - 如何在生产中处理 SSL 服务器证书?