【问题标题】:What is the best way to safely display uploaded files in browser with PHP 5.2 [closed]使用 PHP 5.2 在浏览器中安全显示上传文件的最佳方法是什么 [关闭]
【发布时间】:2012-12-30 15:03:38
【问题描述】:

我正在尝试使用 PHP 为用户上传的文件提供服务。

虽然只指向文件很容易,但似乎一致认为您不应该直接指向网站上的目录,因为这会带来安全风险...如果有人可以通过障碍获取恶意文件到站点上,如果他们知道它在服务器上的位置,那么他们执行它就很容易了。相反,建议将文件放在站点树结构之外的文件夹中,将名称作为原始名称以外的其他名称存储在数据库中,以及隐藏目录的文件路径,并使用读取和显示的 PHP 文件提供它.我能够做到这一切并使用以下方法显示乱码:

// get mime type somehow//

header("Content-type:".$mimetype);
readfile($totalfilepath);

问题是如何获得正确的 mime 类型,以便它显示一个漂亮的文件而不是乱码。

如果你有 5.3,你可以使用 finfo 如下:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
header("Content-Type: ".finfo_file($finfo, 'files/'.$file));
finfo_close($finfo);
readfile('files/'.$file);  

很遗憾,finfo 在 5.2 中不起作用 还有一个函数叫做

mime_content_type

但是,从 4.xx 开始,它已被弃用,并且无论如何都不在我的服务器上。根据我的阅读,在 5.3 之前似乎没有可靠的方法来获取 mime 类型。我不想升级到 5.3,因为它需要升级一个非常大的网站。

注意:允许上传的文件包括.jpg、.gif、.png、.pdf文件,主要office文件、doc、docs、xls、xlx等和txt文件。

另外,我愿意强制下载文件而不是在浏览器中显示它们,但是,首选是在浏览器中显示。

【问题讨论】:

  • 这是一个经过深入研究的深思熟虑的问题,与本网站上数千个没有被否决的蹩脚问题形成鲜明对比。你为什么要否决它?我的具体问题是如何在 5.2 中获得 mime-type?或者如果这是不可能的,是否有另一种方式来提供上传的文件。对你来说够简单吗?
  • 您同意用户下载文件吗?还是必须在屏幕上显示?不是所有文件都可以显示...
  • 在 5.3 finfo 函数之前,使用了 PECL fileinfo extension
  • 我建议完全忽略 MIME 类型或使用默认类型(八位字节流),并仅使用“附件”的想法。
  • 如果您有一个大型应用程序,如您所说,但显然是在不受您控制的主机上运行它,那么我认为问题不在于应用程序,而在于服务器环境。正如这里提到的,5.2 不支持,但如果你坚持使用它,PECL 包是一个很好的解决方案。如果您能够安装此类软件包,那么您在错误的主机 IMO 上。

标签: php file upload mime-types php-5.2


【解决方案1】:

getimagesize() 函数返回所需的信息。 PHP manual 中解释了如何获取此信息。 image_type_to_mime_type() 函数也很有帮助。在线手册中也提供了Examples

【讨论】:

  • 你知道这是否适用于非图像文件,如 pdf、doc、xls、ppt 等?我已经将它用于图像文件,但我在手册中的回忆和文档表明它仅适用于图像文件。
  • 据我所知,它不适用于图像文件。如果要验证其他文件的内容,可能需要编写额外的代码
猜你喜欢
  • 2012-04-22
  • 2015-06-21
  • 2016-05-03
  • 2011-06-16
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
相关资源
最近更新 更多