Disculpas por una respuesta tardía a una pregunta ya respondida, pero no creo que base64_decode ($ x, true) sea una solución suficientemente buena para este problema. De hecho, puede que no haya una solución muy buena que funcione en contra de cualquier entrada dada. Por ejemplo, puedo poner muchos valores incorrectos en $ x y no obtener un valor de retorno falso.
var_dump(base64_decode('wtf mate',true));
string(5) "���j�"
var_dump(base64_decode('This is definitely not base64 encoded',true));
string(24) "N���^~)��r��[jǺ��ܡם"
creo que, además de la verificación estricta de valor de retorno, también tenía que hacer la validación posterior a la decodificación. La forma más confiable es si puede decodificar y luego verificar con un conjunto conocido de valores posibles.
Una solución más general con menos del 100% de precisión (más cerca con cadenas más largas, inexactas para cadenas cortas) es si verifica su salida para ver si hay muchas fuera de un rango normal de utf-8 (o lo que uso) caracteres.
ver este ejemplo:
<?php
$english = array();
foreach (str_split('[email protected]#$%^*()_+|}?><": Iñtërnâtiônàlizætiøn') as $char) {
echo ord($char) . "\n";
$english[] = ord($char);
}
echo "Max value english = " . max($english) . "\n";
$nonsense = array();
echo "\n\nbase64:\n";
foreach (str_split(base64_decode('Not base64 encoded',true)) as $char) {
echo ord($char) . "\n";
$nonsense[] = ord($char);
}
echo "Max nonsense = " . max($nonsense) . "\n";
?>
Resultados:
Max value english = 195
Max nonsense = 233
por lo que puede hacer algo como esto:
if ($maxDecodedValue > 200) {} //decoded string is Garbage - original string not base64 encoded
else {} //decoded string is useful - it was base64 encoded
Probablemente debería utilizar la media() de la decodificado valores en lugar de max(), acabo de utilizar max() en este ejemplo porque lamentablemente no hay media incorporada() en PHP. Qué medida usa (promedio, máximo, etc.) contra qué umbral (por ejemplo, 200) depende de su perfil de uso estimado.
En conclusión, el único movimiento ganador es no jugar. Intentaré evitar tener que distinguir base64 en primer lugar.
desalentador ... – catbadger