我正在为我的网站实现一个基于用户的图像上传工具。系统应允许任何用户仅上传 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 文件放置在 uploads 目录中,以便该目录中的任何文件都无法解析 PHP 文件:
php_admin_value engine Off
4) 将用户的文件重命名为预先确定的名称。 IE。
$filename = 'some_pre_determined_unique_value' . $the_file_extension;
这也将有助于防止 SQL 注入,因为文件名将是所使用的任何查询中唯一由用户确定的变量。
如果我执行上述操作,我仍然容易受到攻击吗?在接受文件之前,我希望 1) 只允许 jpg 和 png,2) 验证 PHP 表示它是有效图像,3) 禁用图像所在的目录执行 .php 文件,4) 将用户文件重命名为某个文件独特的。
Thanks,