如何解决以下文件上传脚本中是否存在任何安全问题 - PHP
我查看了有关使用 PHP 安全上传图像的 StackOverflow 问题的许多答案。我已将以下脚本与解释器放在一起,并想知道这是否缺少任何内容。我唯一/主要担心的是,我似乎无法找到太多关于从图像本身中去除有害代码的信息,尽管代码中部分涵盖了这一点。
几个 SO 答案涉及 GD
图像功能,但它们并没有真正给出任何好的代码示例案例,而且因为我是 PHP 新手,我似乎不太明白如何使用它(在创建图像的新版本方面)。
注意:此代码中的此图像进入“/images”目录,但在实时站点上,它们将进入名为“images”的子域,该子域位于公共文件夹之外,并且仅提供静态文件(没有 PHP、Perl 等)。 short_open_tag
将在 PHP.ini 文件中关闭。
使用名称为“profile-image”的 file
输入类型选择文件。
下面的代码被拆分成它的组成部分——第一部分是 if/isset 语句,用于检查名为“submit-profile-image”的提交按钮是否已被点击,文件是否已上传到内存中['tmp_name']
超全局变量的 $_FILES
键:
if(isset($_POST['submit-profile-image'])) {
$allowed = ['jpeg','jpg','png'];
if($_FILES['profile-image']['error'] === 0 ) {
// THE DIFFERENT CHECKS IN THE MAIN CODE BELOW GO HERE
} else {
$error[] = "Image Failed to load please try again";
}
}
以下代码都包含在上面显示的第二个 if 语句中 - 我已将其分解以显示它的目的:
$profileImageName = $_FILES['profile-image']['name'];
$temp = $_FILES['profile-image']['tmp_name'];
$ext = explode('.',$profileImageName);
$ext = strtolower(end($ext));
$file = uniqid('',true) . time() . '.' . $ext;
清理字符串以提高安全性(可能不需要)
$file = filter_var($file,FILTER_SANITIZE_STRING);
$file = strtolower($file);
if (!in_array($ext,$allowed)) {
$error[] = "File type must be in the jpg / jpeg or png format";
}
使用 getimageSize()
函数检查 MIME 类型,该函数比标准 $_FILES 超全局变量中的 'type' 键更可靠:
$getimageSizeMime = getimageSize($temp);
if(isset($getimageSizeMime['mime']) == false) {
$error[] = "Not a recognised MIME type";
} else {
$getimageSizeMime = $getimageSizeMime['mime'];
}
确保 MIME 类型与文件扩展名匹配:
if (in_array($ext,$allowed) != $getimageSizeMime) {
$error[] = "Mime type must be of the jpg / jpeg or png format";
}
$cleanUpload = file_get_contents($temp) ;
if(preg_match('/(<\?PHP\s)/',$cleanUpload)) {
$error[] = "Image data cannot contain PHP script tags";
}
if(preg_match('/script/',$cleanUpload)) {
$error[] = "Image data cannot contain javascript tags";
}
$cleanUpload = filter_var($cleanUpload,FILTER_SANITIZE_STRING);
if (!isset($error)) {
if(in_array($ext,$allowed)) {
move_uploaded_file($temp,'images/' . $file);
}
}
任何有关遗漏安全问题的输入或对图像文件本身的任何额外检查都将不胜感激 - 特别是关于如何复制图像以仅在可能/必要时使用 GD 库保留图像数据? StackOverflow 上的一些答案非常陈旧,而且似乎提供了不被视为最新的方法(我在这个问题中已经避免了)。
看看是否有任何 PHP 方法可以检查图像文件本身并删除具有潜在危险的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。