Pular para o conteúdo
PHP

PHP: Validando imagens em Base64

Atualizado em
Capa do artigo: PHP: Validando imagens em Base64

Olá Gente

Quando começamos a trabalhar com imagens em base64 precisamos ficar muito atentos a segurança, e sempre validar se esta imagem realmente é uma imagem válida.

Para isto iremos utilizar duas funções do php:

imagecreatefromstring

Esta função ira criar uma referencia de uma imagem, com base em uma string

getimagesizefromstring

Esta função retorna informações da imagem (Entre elas: Tamanho e Tipo)

Então vamos para um exemplo, temos a imagem abaixo, esta imagem esta codificada em base64:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACbElEQVRIib1WO24iQRDttLt62jAiYGxxCkgMZ/AuBOYG5iPsiNyEwx2WQcAVEBIcAQQRBPYViPhMgNR43gZ42eEzA17JW1Il0z31qupVVxVjIWKaZkIp/kxEPSnluxBiLYRYSynfiainFH82TTMRZuOscM7viMghElsigQu6JaJGLBa7vcq4YRg/pOSrKwwfqJR8ZRjGQ6hxpfgLkfj4qnGffijFXwI9JxJe0M+pVBKj0Qij0QipVDIU5CQSzvldUFqUMlCrvWKz2eCPbDYb1GqvUMoITNcBJ5+EnvV6MplAaw3bttHv99Hv92HbNrTWmEwmIdFQgzG2K8XjavF7PZ1OkU7fg0ig2+2i2+2CSCCdvsd0Og2LZmuaZoLt6jzY60jkZn/mByASiERuQqNRSlYYEfX8H113Dc/zkM8/HlzO5bKYz+eYz+fI5bIHZ/n8IzzPg+uuj9PUY7tX+fcjAGitsVwuUS6XYFlxdDodANhzAADtdhuWFUe5XMJyuYTWGgCOyX5jQoj1MUC1WoXjOAAA13WxWCxQKDzt7xQKT1gsFnBdFwDgOA6q1eo5gFUgQLPZPAAoFgv7O8Vi4QCg2WwGA4SlqFQqwrLiaLfbJylqtVqwrDhKpWJ4iv6F5Gz25/UknyvT8XgMrTXq9Tqi0UhgmUajEdTrdWitMR6Pz5fppYc2m82QyaRPADKZNGaz2eWHdqlV+KMZDAYYDAahXp+0CsYYi8Vit9/a7HztOnAWpFJJDIdDDIfDr7fr/zJwfJE8fNvI9HNCRI3j6grQrWHIX1cPfb/s1hZZ2a0t/E1KvvrUt93aIiuX1pbf74M3ytrW+RYAAAAASUVORK5CYII=

A primeira coisa a fazer é remover a indicação “data:image/png;”:

<?
$ImgRaw         = explode("base64,", $ImgRaw);
$ImgRaw         = $ImgRaw[1];
ImgRaw         = str_replace("base64,", "", $ImgRaw);
?>

Agora temos apenas a imagem, vamos decodificar ela:

<?
$ImgDecode      = base64_decode($ImgRaw);
?>

Então, temos a imagem decodificada, vamos fazer o primeiro teste:

<?
$ObjImg         = imagecreatefromstring($ImgDecode);

if(!$ObjImg)
{

return false;

}
?>

Quando o php não consegue criar uma imagem com base na string a função não retorna nada.

Já sabemos que a string realmente é uma imagem, então, para garantir, iremos checar se esta imagem possui informações válidas (Tamanho + mime_type):

<?
$ObjData        = getimagesizefromstring($ImgDecode);

if( !$ObjData || $ObjData[0] == 0 || $ObjData[1] == 0 || !$ObjData["mime"])
{

return false;

}
?>

Fácil né? ❤ Vamos agrupar estas etapas em uma função:

function ValidarImagemBase64($ImgRaw)
{

    $ImgRaw         = explode("base64,", $ImgRaw);
    $ImgRaw         = $ImgRaw[1];
    $ImgRaw         = str_replace("base64,", "", $ImgRaw);
    $ImgDecode      = base64_decode($ImgRaw);

    $ObjImg         = imagecreatefromstring($ImgDecode);

    if(!$ObjImg)
    {

        return false;

    }

    $ObjData        = getimagesizefromstring($ImgDecode);
    
    if( !$ObjData || $ObjData[0] == 0 || $ObjData[1] == 0 || !$ObjData["mime"])
    {

        return false;

    }

    return true;

}

$ImgRaw     = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACbElEQVRIib1WO24iQRDttLt62jAiYGxxCkgMZ/AuBOYG5iPsiNyEwx2WQcAVEBIcAQQRBPYViPhMgNR43gZ42eEzA17JW1Il0z31qupVVxVjIWKaZkIp/kxEPSnluxBiLYRYSynfiainFH82TTMRZuOscM7viMghElsigQu6JaJGLBa7vcq4YRg/pOSrKwwfqJR8ZRjGQ6hxpfgLkfj4qnGffijFXwI9JxJe0M+pVBKj0Qij0QipVDIU5CQSzvldUFqUMlCrvWKz2eCPbDYb1GqvUMoITNcBJ5+EnvV6MplAaw3bttHv99Hv92HbNrTWmEwmIdFQgzG2K8XjavF7PZ1OkU7fg0ig2+2i2+2CSCCdvsd0Og2LZmuaZoLt6jzY60jkZn/mByASiERuQqNRSlYYEfX8H113Dc/zkM8/HlzO5bKYz+eYz+fI5bIHZ/n8IzzPg+uuj9PUY7tX+fcjAGitsVwuUS6XYFlxdDodANhzAADtdhuWFUe5XMJyuYTWGgCOyX5jQoj1MUC1WoXjOAAA13WxWCxQKDzt7xQKT1gsFnBdFwDgOA6q1eo5gFUgQLPZPAAoFgv7O8Vi4QCg2WwGA4SlqFQqwrLiaLfbJylqtVqwrDhKpWJ4iv6F5Gz25/UknyvT8XgMrTXq9Tqi0UhgmUajEdTrdWitMR6Pz5fppYc2m82QyaRPADKZNGaz2eWHdqlV+KMZDAYYDAahXp+0CsYYi8Vit9/a7HztOnAWpFJJDIdDDIfDr7fr/zJwfJE8fNvI9HNCRI3j6grQrWHIX1cPfb/s1hZZ2a0t/E1KvvrUt93aIiuX1pbf74M3ytrW+RYAAAAASUVORK5CYII=";

echo ( ValidarImagemBase64($ImgRaw) == true ) ? "Válido" : "Inválido";

Por hoje é só, pessoal! 🛑

Até mais! 👋

PHP

Leia também