Как проверить, является ли строка base64 действительной в PHP

У меня есть строка и вы хотите протестировать с использованием PHP, если он закодирован в base64 или нет.

Related of "Как проверить, является ли строка base64 действительной в PHP"

Я понимаю, что это старая тема, но использование строгого параметра не обязательно поможет.

Запуск 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; } 

Я попробовал следующее:

  • base64 декодирует строку со строгим параметром, установленным в true.
  • base64 кодирует результат предыдущего шага. если результат не совпадает с исходной строкой, то исходная строка не кодируется base64
  • если результат совпадает с предыдущей строкой, проверьте, содержит ли декодированная строка печатные символы. Я использовал функцию php ctype_print для проверки непечатаемых символов. Функция возвращает false, если строка ввода содержит один или несколько непечатаемых символов.

В следующем коде реализованы следующие шаги:

 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)