アップローダーのセキュリティー

ImageMagickの脆弱性の発表があってかなり面倒くさいことになっております。画像データの中にコマンド埋め込めるので結構厄介です。
緩和策の中に「画像ファイルが処理される前に、アップロードしたファイルの先頭数バイトが画像の種類に相応したマジックバイトで始まっていることを確認してください。これによりアップロードするファイルが実際に画像ファイルであり不正なファイルではないことを確認することができます。」というのがトレンドマイクロ社のサイトに載っていましたが、これImageMagick対策というかふつうのアップローダーのセキュリティー対策なのではなかろうかと。
しかしかつていわれていた「ImageMagickでリサイズ、形式コンバートなどの処理を挟む。」とかは危ない雰囲気になってきましたね。

PHPの画像を判定する関数

  • FileInfo
  • getimagesize
  • imagecreatefromstring
  • exif_imagetype

ここらを駆使して何とかフィルタリングするのがよいかと。拡張子で判断はやっぱりマズイですよ。

/**
 * @param String $filepath ファイルパス(拡張子は当てにしない)
 * @return bool
 */
function isValidImageFile($filepath)
{
    try {
        // WARNING, NOTICE が発生する可能性あり
        $img_info = getimagesize($filepath);
        switch ($img_info[2]) {
            case IMAGETYPE_GIF:
            case IMAGETYPE_JPEG:
            case IMAGETYPE_PNG:
                // イメージリソースが生成できるかどうかでファイルの中身を判定する。
                // データに問題がある場合、WARNING が発生する可能性あり
                if (imagecreatefromstring(file_get_contents($filepath)) !== false) {
                    return true;
                }
        }
    } catch (\ErrorException $e) {

        // ログ出力する文字列の例
        $err_msg = sprintf("%s(%d): %s (%d) filepath = %s",
            __METHOD__, $e->getLine(), $e->getMessage(), $e->getCode(), $filepath);

        // TODO:
        //   - $e->getSeverity() の値によって、ログ出力を変えたりする。
    }
    return false;
}

http://www.pupha.net/archives/3367/

Last update: 2016.05.20 (金)