【问题标题】:PHP remove exif data from imagesPHP从图像中删除exif数据
【发布时间】:2013-11-17 16:59:21
【问题描述】:

使用 PHP 从图像中删除 EXIF 数据是否足以防止恶意代码在服务器中执行?

我想保护服务器免受this blog post 中描述的做法:

<?php

$img = imagecreatefromjpeg('malicious_codes.jpg');
$w = imagesx($img);
$h = imagesy($img);

$trans = imagecolortransparent($img);
if($trans >= 0) {

$rgb = imagecolorsforindex($img, $trans);

$oldimg = $img;
$img = imagecreatetruecolor($w,$h);
$color = imagecolorallocate($img,$rgb['red'],$rgb['green'],$rgb['blue']);
imagefilledrectangle($img,0,0,$w,$h,$color);
imagecopy($img,$oldimg,0,0,0,0,$w,$h);

}

imagejpeg($img,'safe_image.jpg');

?>

【问题讨论】:

  • 我认为这仅在您使用 include 或 require 打开此类 jpeg 时有害(如示例中所示)。与 readfile/file_get_contents/... 的主要区别在于这些语句在读取后评估内容。至少你应该确保在输出之前用 htmlspecialchars 屏蔽 exif 数据。
  • 所以我不需要做这一切hungred.com/useful-information/… 对吧?
  • 内容类型验证 - 验证图像文件内容 - 验证文件扩展名 - 验证会话 - 随机文件名 ...等
  • 这取决于你想对上传的文件做什么。
  • 图片只能从服务器返回为 html

标签: php exif virus


【解决方案1】:

这将在 PHP 中显示来自 JPEG 文件的 EXIF 信息。

$uploadfile = "uploaded/pic.jpg";
$exif = exif_read_data($uploadfile, 0, true);
echo "<b>Your file</b><br />\n";
foreach ($exif as $key => $section) {
    foreach ($section as $name => $val) {
        echo "$key.$name: $val<br />\n";
    }
}

并且这段代码应该删除所有的EXIF信息

$img = new Imagick($uploadfile);
$img->stripImage();
$img->writeImage($uploadfile);

你可以在这里试试: https://iconnaut.com/exif.php

【讨论】:

    【解决方案2】:

    我认为,如果您以任何方式操作图像(例如调整大小),它会丢失一些 exif 数据。 至少在 java 的一个例子中发生了这种情况。

    HERE 也有一个使用 ExifTool 的示例。

    编辑:

    看到这个帖子:Remove EXIF data from JPG using PHP

    【讨论】:

    • 我知道如何删除 exif 数据,我需要知道的是,这是否是防止 jpg、gif 或 png 中的恶意代码的好方法,就像我在问题中提供的链接中的那些代码一样
    • 我理解错了,对不起。所以,为了安全起见,如果我不需要 exif 数据,我会全部删除。但说实话,我不知道这是否是防止这种情况的更好方法。
    • 我问的原因是因为基本上所有通常的措施都是为了防止用户在服务器中找到他的文件,更改它,或者做任何他想要能够执行其中的代码的事情。 ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2011-04-06
    • 1970-01-01
    • 2013-11-16
    • 2011-01-09
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多