Извините за поздний ответ на вопрос, на который уже дан ответ, но я не думаю, что 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('az019AZ~~~!@#$%^*()_+|}?><": 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
Вы, вероятно, должны использовать mean () декодированных значений вместо max (), я просто использовал max () в этом примере, потому что, к сожалению, в PHP нет встроенного среднего (). Какой показатель вы используете (в среднем, максимум и т. Д.) И какой порог (например, 200) зависит от вашего предполагаемого профиля использования.
В заключение, единственный выигрышный ход - не играть. Я бы постарался избежать необходимости распознавать base64.