0

ユーザーに画像のアップロードを提供することには幅広い用途がありますが、ファイル拡張子と MIME タイプをチェックしても正しいファイル タイプは保証されません。

代替手段:からイメージを作成し、それをdirに保存する関数を使用imagejpeg()しました。この場合、関数を無視しました。imagecreatefromjpeg()$_FILE['userfile']['tmp_name']images/move_uploaded_file()

このコードは、偽の画像アップロード攻撃に対して依然として脆弱ですか?

$filename = $_FILE['inputfile']['name'];
$upload_path = 'images/';
//extract extension
$ext = strtolower(substr($filename, strrpos($filename, '.') + 1));

// return mime type ala mimetype extension
$finfo = finfo_open(FILEINFO_MIME_TYPE);
//get MIME type of the given file
$mime = finfo_file($finfo, $filename);
//close finfo
finfo_close($finfo);

if (is_uploaded_file($_FILES['inputfile']['tmp_name'])) {
    //first check: file extension and mime type
    if(!in_array($ext, array('jpeg', 'jpg', 'gif', 'png')) && !in_array($mime, array('image/jpeg', 'image/gif', 'image/png')) ){
     die("Error1: Invalid Image type");
    }
    if($ext == 'jpeg' || $ext == 'jpg'){
       $im = @imagecreatefromjpeg($_FILE['inputfile']['tmp_name']);
       if($im){

        $createimage = imagejpeg($im, $upload_path.$_FILE['inputfile']['name']);
        if(!$createimage){
          die("Error3: Can't create image!");
        }
        //last check
        $filecontent = file_get_contents($upload_path.$_FILE['inputfile']['name']);

        //clean the file from any php code
        $filecontent = str_replace(array("<?php", "<?", "?>"), "", $filecontent);

        $handle = fopen($upload_path.$_FILE['inputfile']['name'], "wb");
        fwrite($handle, $filecontent);
        fclose($handle);
       }
       else{

        die("Error2: Invalid Image Detected");

       }
    }

}
4

1 に答える 1

1

完全に有効な画像ファイルに PHP コードをいつでも安全に埋め込むことができます。それらを回避することを考える価値があるほど、それを行う方法が多すぎます。多くの有効な画像形式、jpg の EXIF などの多くのデータ コンテナー、ピクセル レベルおよび圧縮操作など。

安全のために、任意のファイル インクルージョン攻撃からサーバーを保護し、ファイル拡張子をサニタイズして、Apache の設定ミスを回避する必要があります。

よりクレイジーなアプローチは、画像のわずかに変更されたコピーを作成することです。より正確には、変更された元の画像から新しい画像を作成します。わずかなサイズ変更または色操作により、ビットマップレベルの PHP インジェクションが削除され、コピーによりほとんどの PHP から節約されます。イメージ内の他のデータ コンテナーに挿入されます。

于 2013-08-14T20:55:47.857 に答える