Проверка base64 строки

Как я могу убедится методами php, что полученная строка base64 является изображением jpeg?


Ответы (1 шт):

Автор решения: tutankhamun

Неточный метод

Декодируйте первые 16 байт из base64 (получите 12 байт) и сравните с сигнатурой JPEG файла. Хотя в принципе можно даже не декодировать, а перевести сигнатуры в base64 и сравнивать определенные участки.

Пример кода:

function isLikeJpeg($in)
{
    $signJPEG = "\xff\xd8\xff\xdb";
    $signJFIF = "\xff\xd8\xff\xe0\x00\x00\x4a\x46\x49\x46\x00\x01";
    $signEXIF = "\xff\xd8\xff\xe1\x00\x00\x45\x78\x69\x66\x00\x00";
    $mask = "\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff";

    $head = base64_decode(substr($in, 0, 16)) & $mask;
    return (
        substr($head, 0, 4) === $signJPEG
        || $head === $signJFIF
        || $head === $signJFIF
    );
}

Неточность метода в том что несмотря на правильную сигнатуру содержимое файла может оказаться совсем не JPEGом.

Максимально точный, но ресурсоемкий метод

После применения "неточного метода" если получили результат что это похоже на JPEG нужно проверить содержимое. Декодируйте картинку целиком и скормите функции imagecreatefromstring(). Если получите в результате false, значит там не изображение.

Обратите внимание, что если вы принимаете "изображение" от пользователя, оно может оказаться достаточно большим чтобы PHP интерпретатор превысил лимит расходуемой памяти. Поэтому перед применением второй части проверяйте длину полученной строки.

Также можно воспользоваться расширением FileInfo (функция finfo_file()). Я не проверял, но это расширение наверняка сравнивает только сигнатуры и работает с файлами

См. также:

→ Ссылка