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! 👋
Leia também
API Mágica: notificações Web Push no navegador com PHP
Web Push com a API Mágica em PHP puro: o navegador se inscreve, o seu site envia a notificação e a API conta o clique. Sem Composer e sem biblioteca.
IndexNow: avisando o Bing e o Yandex mais rápido
Como criar a chave do IndexNow e avisar Bing e Yandex das suas páginas novas com Node.js e PHP: as requisições, os erros reais e as armadilhas.
llms.txt: por que importa e como gerar em PHP
Por que o llms.txt importa para quem quer ser citado pela IA, e como gerar o seu em PHP puro lendo o sitemap.xml que voce ja tem.