Ci scusiamo per una risposta tardiva a una domanda già risposta, ma non penso che base64_decode ($ x, true) sia una soluzione sufficientemente buona per questo problema. Infatti, potrebbe non esserci un'ottima soluzione che funziona contro qualsiasi input dato. Per esempio, posso mettere molti valori sbagliati in $ x e non ottenere un valore di ritorno 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Ǻ��ܡם"
credo che oltre al controllo rigoroso valore di ritorno, avresti anche bisogno di fare la convalida post-decodifica. Il modo più affidabile è se fosse possibile decodificare e quindi verificare contro un insieme noto di possibili valori.
Una soluzione più generale con meno del 100% di precisione (più vicino con stringhe più lunghe, imprecise per stringhe corte) è se si controlla l'output per vedere se molti sono al di fuori di un normale intervallo di utf-8 (o qualsiasi altra codifica usare) caratteri.
Vedi questo esempio:
<?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";
?>
Risultati:
Max value english = 195
Max nonsense = 233
così si può fare qualcosa di simile:
if ($maxDecodedValue > 200) {} //decoded string is Garbage - original string not base64 encoded
else {} //decoded string is useful - it was base64 encoded
Probabilmente si dovrebbe utilizzare la media() della decodificato valori invece di max(), ho appena usato max() in questo esempio perché non c'è tristemente built-in mean() in PHP. Quale misura si utilizza (media, max, ecc.) Rispetto a quale soglia (ad esempio 200) dipende dal profilo di utilizzo stimato.
In conclusione, l'unica mossa vincente non è quella di giocare. Cercherò di evitare di dover discernere base64 in primo luogo.
sconsigliato ... – catbadger