Извинения за поздний ответ на уже ответили на вопрос, но я не думаю, что base64_decode ($ x, true) является достаточно хорошим решением для этой проблемы. На самом деле не может быть очень хорошего решения, которое работает против любого заданного ввода. Например, я могу положить много плохих значений в $ x и не получить ложное возвращаемое значение.
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Ǻ��ܡם"
Я думаю, что в дополнение к строгой проверки возвращаемого значения, вы должны были бы сделать проверку после декодирования. Самый надежный способ - если вы можете декодировать, а затем проверить на известном наборе возможных значений.
Более общее решение с точностью менее 100% (ближе к более длинным строкам, неточным для коротких строк), если вы проверяете свой вывод, чтобы увидеть, находятся ли многие вне нормального диапазона utf-8 (или что-то другое, кодирующее вас использование).
Смотрите этот пример:
<?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";
?>
Результаты:
Max value english = 195
Max nonsense = 233
Таким образом, вы можете сделать что-то вроде этого:
if ($maxDecodedValue > 200) {} //decoded string is Garbage - original string not base64 encoded
else {} //decoded string is useful - it was base64 encoded
Вы, вероятно, следует использовать среднее значение() декодированного значения вместо max(), я просто использовал max() в этом примере, потому что в PHP нет встроенного среднего(). Какую меру вы используете (средний, макс и т. Д.) Против того, какой порог (например, 200) зависит от вашего предполагаемого профиля использования.
В заключение, единственный выигрышный ход - не играть. Я бы постарался не распознавать base64 в первую очередь.
... – catbadger