У меня есть строка и вы хотите протестировать с использованием PHP, если он закодирован в base64 или нет.
Я понимаю, что это старая тема, но использование строгого параметра не обязательно поможет.
Запуск base64_decode в строке, такой как «Я не закодирован в базе 64», не вернет false.
Если, однако, вы попытаетесь декодировать строку со строгим и перекодировать ее с помощью base64_encode, вы можете сравнить результат с исходными данными, чтобы определить, является ли это допустимым значением в кодировке bas64:
if ( base64_encode(base64_decode($data, true)) === $data){ echo '$data is valid'; } else { echo '$data is NOT valid'; }
Вы можете использовать эту функцию:
function is_base64($s) { return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s); }
Этот код должен работать, поскольку функция декодирования возвращает FALSE, если строка недействительна:
if (base64_decode($mystring, true)) { // is valid } else { // not valid }
Вы можете больше узнать о функции base64_decode в документации .
Я думаю, что единственный способ сделать это – сделать base64_decode()
с параметром $strict
установленным в true
, и посмотреть, вернет ли он false
.
Только для строк вы можете использовать эту функцию, которая проверяет несколько свойств base64 перед возвратом true:
function is_base64($s){ // Check if there are valid base64 characters if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s)) return false; // Decode the string in strict mode and check the results $decoded = base64_decode($s, true); if(false === $decoded) return false; // Encode the string again if(base64_encode($decoded) != $s) return false; return true; }
Это действительно старый вопрос, но я нашел следующий подход, чтобы быть практически пуленепробиваемым. Он также учитывает те странные строки с недопустимыми символами, которые могут вызвать исключение при проверке.
public static function isBase64Encoded($str) { try { $decoded = base64_decode($str, true); if ( base64_encode($decoded) === $str ) { return true; } else { return false; } } catch(Exception $e) { // If exception is caught, then it is not a base64 encoded string return false; } }
Я получил эту идею с этой страницы и адаптировал ее к PHP.
Вы можете просто отправить строку через base64_decode
(с $ strict set to TRUE), она вернет FALSE, если вход недействителен.
Вы также можете использовать регулярные выражения fi, чтобы увидеть, содержит ли строка какие-либо символы вне алфавита base64 и проверяет, содержит ли она правильное количество отступов в конце ( =
символы). Но просто использовать base64_decode намного проще, и не должно быть риска неправильной строки, вызывающей какой-либо вред.
base64_decode () должен возвращать значение false, если ваши кодированные данные base64 недопустимы.
Старая тема, но я нашел эту функцию и она работает:
function checkBase64Encoded($encodedString) { $length = strlen($encodedString); // Check every character. for ($i = 0; $i < $length; ++$i) { $c = $encodedString[$i]; if ( ($c < '0' || $c > '9') && ($c < 'a' || $c > 'z') && ($c < 'A' || $c > 'Z') && ($c != '+') && ($c != '/') && ($c != '=') ) { // Bad character found. return false; } } // Only good characters found. return true; }
я знаю, что я прибегаю к очень старому вопросу, и я попробовал все предложенные методы; я, наконец, заканчиваю этим регулярным выражением, которое охватывает почти все мои случаи:
$decoded = base64_decode($string, true); if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false;
в основном я проверяю каждый символ, который не может быть распечатан (: graph 🙂 не является пробелом или вкладкой (\ s) и не является буквой unicode (все акценты ex: èéùìà и т. д.),
Я все еще получаю ложный позитв с этими символами: £ § °, но я никогда не использую их в строке, и для меня это прекрасно, чтобы аннулировать их. Я суммирую эту проверку с функцией, предложенной @merlucin
поэтому результат:
function is_base64($s) { // Check if there are valid base64 characters if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s)) return false; // Decode the string in strict mode and check the results $decoded = base64_decode($s, true); if(false === $decoded) return false; // if string returned contains not printable chars if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false; // Encode the string again if(base64_encode($decoded) != $s) return false; return true; }
Я попробовал следующее:
В следующем коде реализованы следующие шаги:
public function IsBase64($data) { $decoded_data = base64_decode($data, true); $encoded_data = base64_encode($decoded_data); if ($encoded_data != $data) return false; else if (!ctype_print($decoded_data)) return false; return true; }
Вышеприведенный код может возвращать неожиданные результаты. Например, для строки «json» она вернет false. «json» может быть допустимой строкой с кодировкой base64, так как количество символов, которое у нее есть, кратно 4, и все символы находятся в разрешенном диапазоне для строк с кодировкой base64. Кажется, мы должны знать диапазон допустимых символов исходной строки, а затем проверить, имеют ли декодированные данные эти символы.
Если данные недействительны base64, то функция base64_decode ($ string, true) вернет FALSE.
Я использую этот подход. Он ожидает, что последние 2 символа будут ==
substr($buff, -2, 1) == '=' && substr($buff, -1, 1) == '=')
Обновление: я закончил делать еще одну проверку, если один из них завершил неудачу base64_decode ($ buff, true)