微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以下文件上传脚本中是否存在任何安全问题 - PHP

如何解决以下文件上传脚本中是否存在任何安全问题 - 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) ;

如果文件内容包含 PHPscript,则禁止

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";
}

清理 HTML 标签文件内容

$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 举报,一经查实,本站将立刻删除。