@imagecreatefromjpeg和imagejpeg()是否有效阻止用户上传含有恶意php代码的图像?

时间:2014-02-12 04:29:56

标签: php security code-injection

以下是upload_processor.php中的代码:

include_once 'functions.php';

$name = $_FILES['upload-image']['name'];
$type = $_FILES['upload-image']['type'];
$size = $_FILES['upload-image']['size'];
$temp = $_FILES['upload-image']['tmp_name'];
$error = $_FILES['upload-image']['error'];

img_processor($temp, $error, $size)

这是functions.php

function img_processor($img_temp, $img_error, $img_size){
    if($img_error===0){
        if($img_size < 4194304){
            if( $proc_img = @imagecreatefromjpeg($img_temp) ){
                imagejpeg($proc_img,'../uploaded/something.jpeg');
            } elseif( $proc_img = @imagecreatefrompng($img_temp) ){
                imagepng($proc_img,'../uploaded/something.png');
            } elseif( $proc_img = @imagecreatefromgif($img_temp) ){
                imagegif($proc_img,'../uploaded/something.gif');
            } else {
                echo("Only JPEGs, PNGs, and GIFs are allowed");
            }

            if(isset($proc_img)){
                echo("upload complete");                
            }

        } else {
            echo("Your file was too big. Only images that are 4MB or less are allowed");
        }
    } else {
        echo('Error uploading file! Code '.$img_error);
    }
}

基本思路是重新创建图像,然后重命名,以便任何人都无法上传malicious_code.php.jpg之类的内容。

此代码中有哪些漏洞?有没有更好的方法来保护我的网站免受注入PHP的图像?

1 个答案:

答案 0 :(得分:0)

  1. 如果出现错误,imagegreatefrom*将返回false,因此@运算符在这种情况下实际上并没有做太多。

  2. 您可以使用imagecreatefrom*检查输入文件是否有效,然后调用适当的处理程序,而不是调用exif_imagetype。我不确定是否存在安全隐患(虽然直觉上听起来可能存在上述代码的安全问题),但性能应该提高,因为每次真值测试失败时都不必创建图像资源。

    $handlers = array(
        IMAGETYPE_GIF => 'imagecreatefromgif',
        IMAGETYPE_JPEG => 'imagecreatefromjpeg',
        IMAGETYPE_PNG => 'imagecreatefrompng'
    );
    $type = exif_imagetype($img_temp);
    
    if(array_key_exists($type,$handlers)){
           $proc_img = call_user_func_array($handlers[$type],array($img_temp));
    } else {
        // do error logic here
    }
    
  3. 另一个额外的好处是你可以添加处理程序而不必创建一个巨大的if语句。有关详细信息,请参阅http://www.php.net/manual/en/function.exif-imagetype.php