gpt4 book ai didi

php - PHP 中的安全用户图像上传功能

转载 作者:可可西里 更新时间:2023-10-31 22:40:14 26 4
gpt4 key购买 nike

我正在为我的网站实现一个基于用户的图片上传工具。系统应该只允许任何用户上传 JPEG 和 PNG 文件。当然,我担心安全问题,所以我想知道许多比我聪明的人对以下允许上传的检查有何看法:

1) 首先将 PHP 中允许的文件扩展名列入白名单,仅允许 PNG、png、jpg、JPG 和 JPEG。通过以下函数检索用户文件的扩展名:

return end(explode(".", $filename));

这应该有助于禁止用户上传诸如 .png.php 之类的恶意内容。如果通过,转到第 2 步。

2) 在 TMP 文件上运行 php 函数 getimageize()。通过类似的东西:

getimagesize($_FILES['userfile']['tmp_name']);

如果没有返回 false,继续。

3) 确保将 .htaccess 文件放在上传目录中,以便此目录中的任何文件都无法解析 PHP 文件:

php_admin_value engine Off

4) 将用户的文件重命名为预先确定的名称。即

$filename = 'some_pre_determined_unique_value' . $the_file_extension;

这也有助于防止 SQL 注入(inject),因为文件名将是使用的任何查询中唯一由用户确定的变量。

如果我执行上述操作,我对攻击的脆弱性有多高?在接受一个文件之前,我应该希望 1) 只允许 jpgs 和 pngs,2) 验证 PHP 说它是一个有效的图像,3) 禁止图像所在的目录执行 .php 文件,以及 4) 将用户文件重命名为某个东西独一无二。

谢谢,

最佳答案

关于文件名,随机命名绝对是个好主意,可以省去很多麻烦。

如果您想完全确保内容干净,请考虑使用 GD 或 ImageMagick 将传入图像 1:1 复制到一个新的空图像中。

这会稍微降低图像质量,因为内容会被压缩两次,但它会删除原始图像中存在的所有 EXIF 信息。用户通常甚至不知道有多少信息被放入 JPG 文件的元数据部分!相机信息、位置、时间、使用的软件……对于托管图像的网站来说,为用户删除这些信息是一个很好的政策。

此外,复制图像可能会消除大多数使用错误图像数据导致查看器软件溢出并注入(inject)恶意代码的漏洞。此类经过处理的图像对于 GD 来说可能根本无法读取。

关于php - PHP 中的安全用户图像上传功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3644138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com