Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Запуск base64_decode в строке, такой как "Я не кодирован базой 64", не вернет false.

Если вы попытаетесь декодировать строку со строгим и перекодировать ее с помощью base64_encode, вы можете сравнить результат с исходными данными, чтобы определить, действительно ли оно закодированное значение base64:

if ( base64_encode(base64_decode($data, true)) === $data){
    echo '$data is valid';
} else {
    echo '$data is NOT valid';
}

Ответ 2

Вы можете использовать эту функцию:

 function is_base64($s)
{
      return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s);
}

Ответ 3

Этот код должен работать, поскольку функция декодирования возвращает FALSE, если строка недействительна:

if (base64_decode($mystring, true)) {
    // is valid
} else {
    // not valid
}

Подробнее о функции base64_decode вы можете узнать в документации.

Ответ 4

Я думаю, что единственный способ сделать это - сделать base64_decode() с параметром $strict, установленным на true, и посмотрите, возвращает ли он false.

Ответ 5

Только для строк вы можете использовать эту функцию, которая проверяет несколько свойств 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;
}

Ответ 6

Это действительно старый вопрос, но я нашел следующий подход, чтобы быть практически пуленепробиваемым. Он также учитывает те странные строки с недопустимыми символами, которые могут вызвать исключение при проверке.

    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.

Ответ 7

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

  • 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. Кажется, мы должны знать диапазон допустимых символов исходной строки, а затем проверить, имеют ли декодированные данные эти символы.

Ответ 8

Я пишу, что этот метод отлично работает на моих проектах. Когда вы передаете Base64 Image этому методу, если он действителен, возвращайте true, иначе возвращайте false. Давайте попробуем и дайте мне знать, что-то не так. Я буду редактировать и учиться в функции.

/**
 * @param $str
 * @return bool
 */
private function isValid64base($str){
    if (base64_decode($str, true) !== false){
        return true;
    } else {
        return false;
    }
}

Ответ 9

Вы можете просто отправить строку через base64_decode (с $strict set to TRUE), она вернет FALSE, если вход недействителен.

Вы также можете использовать f.i. регулярные выражения видят, содержит ли строка какие-либо символы вне алфавита base64 и проверяют, содержит ли она правильное количество отступов в конце (= символов). Но просто использовать base64_decode намного проще, и не должно быть риска неправильной строки, вызывающей какой-либо вред.

Ответ 10

base64_decode() должен возвращать false, если ваши кодированные данные base64 недействительны.

Ответ 11

Старая тема, но я нашел эту функцию, и она работает:

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;
}

Ответ 12

Я знаю, что я прибегаю к очень старому вопросу, и я попробовал все предложенные методы; я, наконец, заканчиваю этим регулярным выражением, которое охватывает почти все мои случаи:

$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;
}

Ответ 13

Я кодирую решение для проверки изображений, проверяя синтаксис

$image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABfVBMVEUAAAAxMhQAoIpFLCTimAE2IRs0IBodEg4OJyEAnYcAmoUAjnoALyn5rgNJLydEKyM5lWFFLCTuogI/JyBAKCHZnQoAlIAAkn48JR6fYgCIVACDUACPbAsAW06IWgAaDw0jFQscEQ4Am4XIfQDGewDhlwHelQEAi3gAe2oAd2cAXE8gFBAeEg8AVEgAtJwAsZn/vhMAuJ//xyMAu6BfQTf/wxv9wRlcPjVhQjj/vBBdQDb/xR9oSD1iRDlWOjH9xSL/uQr+twhkRTplRjxZPDPZpydILydAQD+pezNjRTNQNS3tuCZGLSX4sQn/tQTllgDhkgAArZUAqJFvTUD/wRgGtpp2m0aPaTl+azOIcjGkhS6OaS1ONCvNnirHmSrnsifHnSfFjyemfCfcqSa/jyLwuR/ptB/MmRxiPhnpqRX1sxHzqwnCfgb+tQTYjALnmQH2qQDzpQDejgAnsYQnsYNwTkBlRTtfQi9eQS+1kCy2kSuFYSuEYSvkpRfrqxQPeVhkAAAALnRSTlMADPz0qnhzNBPry5kH/vr36ubKxLy4sKmifVVNQT84Ih4Y2aWloqKMgHdJPDwse8ZSvQAAAbVJREFUOMuV0uVzggAYx3Gsbca6u3vDqSDqBigD25nrLrvX+bfvMSeId9vnBXD3+97zCuQ/ZhUDvV1dvQOKWfFdIWOZHfDMyhRi+4ibZHZLwS5Dukea97YzzAQFYEgTdtYm3DtkhAUKkmFI0mTCCFmH8ICbsEBRhmEWwi080U+xBNwApZlgqX7+rummWJcLEkAQLhdLdWt4wbSXOqX1Hu784uKc8+jpU8o7zQva7RSnb8BR9nZesGF/oelLT2X1XNL0q31dcOGDPnwKO7eBMxw+pD8FF2a8N9vcyfttKbh9O+HwG+8MLxiL3+FXDsc9Du4djiv8Lj7GC0bTMTx6dGzEgfH4KIrH0qO8YDyQjESMvyLJwDjCs5DaKsvlzOV3ah4RkFcCM+wlckRoymcG107ntRn4ppAmSzar9Tvh830lrFbbItJM0meDBcCzT4KIFfLOzB7IdMphFzUxWMjnC4MToqNkbWVY1RPw+wM9quHVSY1gnhyShlCd4aHo9xcfDTptSKnebPxjh0Kooewgmz2ofKFStaS+z2l1Nfv79c+gqlaog6io4HI1UKItKKuBVNuCFPmDH12fd4lDaGbkAAAAAElFTkSuQmCC';
$allowedExtensions = ['png', 'jpg', 'jpeg'];

// check if the data is empty
if (empty($image)) {
    echo "Empty data";
}

// check base64 format
$explode = explode(',', $image);
if(count($explode) !== 2){
    echo "This string isn't sintaxed as base64";
}
//https://stackoverflow.com/a/11154248/4830771
if (!preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $explode[1])) {
    echo "This string isn't sintaxed as base64";
}

// check if type is allowed
$format = str_replace(
        ['data:image/', ';', 'base64'], 
        ['', '', '',], 
        $explode[0]
);
if (!in_array($format, $allowedExtensions)) {
    echo "Image type isn't allowed";
}
echo "This image is base64";

Но безопасным способом является использование вмешательства

use Intervention\Image\ImageManagerStatic;
try {
    ImageManagerStatic::make($value);
    return true;
} catch (Exception $e) {
    return false;
}

Ответ 14

САМЫЕ ОТВЕТЫ ЗДЕСЬ НЕ НАДЕЖНЫ

На самом деле, нет надежного ответа, так как многие тексты, не закодированные в base64, будут читаться как закодированные в base64, так что нет способа узнать наверняка по умолчанию.

Кроме того, стоит отметить, что base64_decode будет декодировать много неверных строк Например, and не является допустимой кодировкой base64, но base64_decode БУДЕТ ее декодировать. Как конкретно jw. (Я научился этому нелегко)

Тем не менее, ваш самый надежный способ, если вы управляете вводом, добавить после строки код идентификатора, который является уникальным, а не base64, и включить его вместе с другими проверками. Это не пуленепробиваемый, но гораздо более пуленепробиваемый, чем любое другое решение, которое я видел. Например:

function my_base64_encode($string){
  return "z64ENCODEDz_" . base64_encode() . "_z64ENCODEDz";
}
function my_base64_decode($string){
  return rtrim(ltrim($string, "z64ENCODEDz_"), "_z64ENCODEDz");
}
function is_my_base64_encoded($string){
  if (strpos($string, 0, 12) == "z64ENCODEDz_" && strpos($string, -1, 12) == "_z64ENCODEDz" && my_base64_encode(my_base64_decode($string)) == $string && strlen($string)%4 == 0){
    return true;
  } else {
    return false;
  }
}

Ответ 15

Если данные недействительны base64, тогда функция base64_decode ($ string, true) вернет FALSE.

Ответ 16

Я использую этот подход. Он ожидает, что последние 2 символа будут ==

substr($buff, -2, 1) == '=' && substr($buff, -1, 1) == '=')

Обновление: я закончил делать еще одну проверку, если одна из них не выполнена base64_decode ($ buff, true)