PHPで画像ファイルかどうかを検証する(Laravel)

PHP

特定のファイルが画像ファイルかどうかを検証するPHPの関数を書いてみました。ウェブサイトにアップロードされた画像ファイルを検証する時などに使うことを想定しています。

  • GIF/JPEG/PNG のみ対象としています。
  • Laravelを使っていることを前提としているので、エラー発生時には ErrorExceptionクラスの例外がスローされます。
  • getimagesize関数はマジックバイトを見ているだけなので、念のため imagecreatefromstring関数でイメージリソースが生成できるかチェックしています。
/**
 * @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);

        switch ($e->getSeverity()) {
            case E_WARNING:
                \Log::warning($err_msg);
                break;
            case E_NOTICE:
                \Log::notice($err_msg);
                break;
            default:
                \Log::error($err_msg);
        }
    }

    return false;
}

こちらにもまとめておきました。→ PHPのセキュリティ対策 – Secure Code Tips

最終更新日: 2015-05-15

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*