Как проверить, является ли строка base64 допустимой в PHP - PullRequest
50 голосов
/ 25 ноября 2010

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

Ответы [ 15 ]

89 голосов
/ 29 мая 2012

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

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

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

if ( base64_encode(base64_decode($data, true)) === $data){
    echo '$data is valid';
} else {
    echo '$data is NOT valid';
}
20 голосов
/ 22 июня 2012

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

 function is_base64($s)
{
      return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s);
}
11 голосов
/ 25 ноября 2010

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

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

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

6 голосов
/ 25 ноября 2010

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

5 голосов
/ 22 мая 2014

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

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

    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.

0 голосов
/ 12 июля 2019

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

/**
 * @param $str
 * @return bool
 */
private function isValid64base($str){
    if (base64_decode($str, true) === false){
        return true;
    } else {
        return false;
    }
}
0 голосов
/ 19 декабря 2018

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

$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;
}
0 голосов
/ 28 июля 2016

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

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

0 голосов
/ 21 апреля 2016

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

$decoded = base64_decode($string, true);
if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false;

в основном я проверяю каждый символ, который не может быть напечатан (: graph :) не является пробелом или табуляцией (\ s) иэто не юникодная буква (все акценты, например, èéùìà и т.Я объединяю эту проверку с функцией, предложенной @ 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...