Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá,
Bom, queria saber se tem como em uma string, verificar se ela é base64.
Em posse disso, estarei usando base64_decode para decodificação.
Pensei em fazer um if nessa string e se os dois ultimos digitos contiverem "==" então ela é base64, mais é um jeito não tão confiável, pois existem lugares em que o == não aparece em um base64.
Grato,
Abraço!
Veja que louco
<?php
var_dump( base64_encode( '#de' ) ); // string 'I2Rl' (length=4)
var_dump( base64_decode( 'I2Rl#', true ) ); // boolean false
var_dump( base64_decode( 'I2Rl====', true ) ); // string '#de' (length=3)
var_dump( base64_decode( 'I2Rl', true ) ); // string '#de' (length=3)
Pois é, # não é aceito em base64.
Sim, isso eu vi.
O detalhe está em decodificar a string 'I2Rl====' e 'I2Rl', gera o mesmo resultado.
Simples.
Você condiciona o retorno de base64_decode() à FALSE. Se não o for, você faz algo:
$decoded = base64_decode( $input );
if( $decoded !== FALSE ) {
// Do something
}
Felizmente a função de decodificação não dispara nenhum erro permitindo usar o retorno negativo como argumento condicional.
function decodificar_base64($input) {
$hospedeiro = base64_decode($input);
if ($hospedeiro !== FALSE) {
echo base64_decode($input);
} else {
echo "Não é base64!";
}
}
Bruno Agusto,
Coloquei dessa forma e não obtive sucesso, pode me dizer se fiz algo de errado ? Ele só cai no !== e se digito algo que não seja base64 ele não cai no else.
Muito obrigado.
algo assim, Leandro:
function decodificar_base64($input)
{
if ( $input = base64_decode($input) ) {
return $input;
}
return false;
}
claro que não é 100% funcional, mas é o que chega "mais próximo"..
E se você tiver certeza daquilo que pode ser considerado como TRUE, pode adicionalmente fazer uma ER simples buscando por caracteres alfa-numéricos na string decodificada:
if( preg_match( '/\w+/', $decoded ) == 0 ) {
// Valido por base64_decode(), mas inválido segundo parâmetro de quem criou
}
Pelo menos, restringiria ainda mais, dimunuindo alguns falsos positivos.
Esse tipo de verificação adicional também pode ser aplicado para, por exemplo, se a string codificada esperada for um array serializado, ao invés do preg_match() poderia optar por unserialize(), verificando um possível FALSE.
Amigo, isso é praticamente impossível .. o máximo que você pode fazer é:
Saída:
Não
Porque contém caracteres que não são válidos, a expressão é justamente para isso, verificar se a string está no padrão de caracteres válidos para base64.