4

我想让用户从远程 url 复制或下载图像或从他们的计算机上传文件(可能包括 pdf 和 txt 文件等)。为此,我尝试了我的主机支持的 ​​file_get_contents 和 curl。对于本地上传,我只是使用 php。他们完成传输数据的基本工作。但是,我正在尝试找到验证文件内容的最佳方法,以避免传播恶意代码或用过大的文件加载我的服务器。

在许多情况下,文件将动态生成,因此不会以已知扩展名结尾,因此除了缺乏安全性之外,检查文件扩展名不是一种选择。

使用标题中的 mime 类型是一种选择,我有代码可以做到这一点。

$file_info = new finfo(FILEINFO_MIME);  // object oriented approach!
$mime_type = $file_info->buffer(file_get_contents($file));  // e.g. gives "image/jpeg"

switch($mime_type) {
    case "image/jpeg":
        // your actions go here...
}

但是,欺骗 mime 类型显然并不难。

一些帖子建议在文件开头嗅出神奇的数字,但这些也可以被欺骗。

对于图像的有限情况,可以使用

$imginfo_array = getimagesize($tempFile); 

据我所知,这不适用于 pdf、文档等。

即使将这些方法放在一起似乎也不是很健壮。然而,许多网站通常允许您上传、固定或以其他方式获取远程文件,并以某种方式管理安全问题。

希望获得有关最佳安全性和验证实践的建议——例如 curl、file_get_contents 和 wd——以及在传输到我的服务器之前获取文件大小和文件类型的其他库或其他技术。

注意:我希望允许传输 .jpg 和 .gif 等主流图像格式以及上传 pdf 文件、doc 和 docx 文件、xls 文件以及类似的常见格式。

提前感谢您的建议和建议。

4

1 回答 1

1

但是,我正在尝试找到验证文件内容的最佳方法,以避免传播恶意代码

文件上传是我想在 PHP 生态系统中消除的攻击面之一。无论您是使用 cURL 下载文件还是允许用户从 Web 表单提交文件,解决方案都没有太大变化。

解决远程代码执行问题:将文件上传到 Web 根目录之外的不可公开访问的文件夹,然后使用代理脚本(提示:readfile()file_get_contents())提供它们,而不是允许直接访问。

那么即使有恶意代码,Apache/nginx 也不会想去执行它。

...或用过大的文件加载我的服务器

如果您使用 cURL,这很容易做到

于 2017-12-28T18:11:35.260 回答