source

문자열이 PHP에서 base64인지 확인하는 방법

itover 2022. 12. 1. 21:32
반응형

문자열이 PHP에서 base64인지 확인하는 방법

문자열이 있는데 PHP를 사용하여 유효한 base64 인코딩 여부를 테스트하고 싶습니다.

나는 이것이 오래된 주제라는 것을 알지만, 엄격한 매개변수를 사용하는 것이 반드시 도움이 되는 것은 아니다.

"I am base 64 encoded" 등의 문자열에서 base64_decode를 실행해도 false가 반환되지 않습니다.

그러나 strict로 문자열을 디코딩하고 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);
}

문자열에 대해서만 true를 반환하기 전에 여러 base64 속성을 확인하는 이 함수를 사용할 수 있습니다.

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

문자열이 유효하지 않으면 디코드 함수가 FALSE를 반환하므로 이 코드가 작동합니다.

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

base64_decode 함수에 대한 자세한 내용은 설명서를 참조하십시오.

그렇게 하는 유일한 방법은 이 모든 데이터를$strict가 「」로 되어 있다.true 여부를 false.

이것은 매우 오래된 질문이지만, 나는 다음과 같은 접근법이 사실상 방탄이라는 것을 알았다.또한 검증 시 예외가 발생할 수 있는 잘못된 문자가 포함된 이상한 문자열도 고려됩니다.

    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는 엄밀한 파라미터를 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 부호화 문자열일 수 있습니다.이는 base64 부호화 문자열에 허용된 문자 수가 4의 배수이기 때문입니다.원래 문자열의 허용 문자 범위를 알고 디코딩된 데이터에 해당 문자가 포함되어 있는지 확인해야 할 것 같습니다.

나는 이 방법이 내 프로젝트에서 완벽하게 작동하고 있다고 쓴다.base64 이미지를 이 메서드에 전달하면 유효한 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.뭔가 잘못된 게 있으면 알려주자.편집해서 특집으로 배우겠습니다.

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

자, 여러분...마침내 나는 이 문제에 대한 방탄 해결책을 찾았다.다음 함수를 사용하여 문자열이 base64로 인코딩되었는지 확인합니다.

    private function is_base64_encoded($str) {

       $decoded_str = base64_decode($str);
       $Str1 = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $decoded_str);
       if ($Str1!=$decoded_str || $Str1 == '') {
          return false;
       }
       return true;
    }

이미지/파일 백엔드에 업로드하기 위해 js를 사용하여 API 호출을 수행하는 경우 도움이 될 수 있습니다.

function is_base64_string($string)  //check base 64 encode 
{
  // Check if there is no invalid character in string
  if (!preg_match('/^(?:[data]{4}:(text|image|application)\/[a-z]*)/', $string)){
    return false;
  }else{
    return true;
  }

}

오래된 토픽이지만 이 기능을 찾았고 작동 중입니다.

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

Sintaxy를 확인하는 이미지를 검증하기 위한 솔루션을 코드화합니다.

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

그냥 스트링을 보내주시면 됩니다.base64_decode($strict) TRUE ($strict) FALSE ($strict) TRUE ($strict) TRUE)입니다.

. 정규 되어 있는지 에 적절한 양의되어 있는지 를 확인할 수 (f.i. "는 "base64").=문자)를 참조해 주세요., 를 사용하는 만으로 훨씬또, base64_decode는 를 입을 도 없습니다.또한 잘못된 형식의 문자열로 인해 피해를 입을 위험도 없습니다.

base64 인코딩된 데이터가 유효하지 않으면 base64_false()는 false를 반환합니다.

저는 매우 오래된 질문을 던지고 제안된 모든 방법을 시도해 보았습니다.결국 제 케이스의 거의 모든 것을 망라한 regex로 끝납니다.

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

기본적으로 인쇄할 수 없는 모든 문자(: graph:)는 공백이나 탭(\s)이 아니며 유니코드 문자(모든 악센트 예: é)à)) 등)가 아닌 것을 확인합니다.

나는 여전히 이 문자에 대해 잘못된 긍정을 가지고 있다: £440° 하지만 나는 그것들을 문자열로 사용하지 않는다.그리고 나는 그것들을 무효화해도 전혀 괜찮다.이 체크는 @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;
}

대부분의 답변은 신뢰성이 없습니다.LE

사실, 많은 비base64 인코딩 텍스트는 base64 인코딩으로 읽을 수 있기 때문에 확실하게 알 수 있는 기본 방법은 없습니다.

또한 base64_decode는 다수의 비활성 문자열을 디코딩합니다.exmaple의 경우,andbase64는 base64_decode WIL이다.~로jw

즉, 가장 신뢰할 수 있는 방법은 입력을 제어하는 경우 base64가 아닌 고유 부호화 후 문자열에 식별자를 추가하여 다른 체크와 함께 포함시키는 것입니다.방탄은 아니지만, 내가 본 어떤 솔루션보다 훨씬 방탄성이 뛰어납니다.예를 들어 다음과 같습니다.

function my_base64_encode($string){
  $prefix = 'z64ENCODEDz_';
  $suffix = '_z64ENCODEDz';
  return $prefix . base64_encode($string) . $suffix;
}

function my_base64_decode($string){
  $prefix = 'z64ENCODEDz_';
  $suffix = '_z64ENCODEDz';
  if (substr($string, 0, strlen($prefix)) == $prefix) {
    $string = substr($string, strlen($prefix));
  }
  if (substr($string, (0-(strlen($suffix)))) == $suffix) {
    $string = substr($string, 0, (0-(strlen($suffix))));
  }
      return base64_decode($string);
}

function is_my_base64_encoded($string){
  $prefix = 'z64ENCODEDz_';
  $suffix = '_z64ENCODEDz';
  if (strpos($string, 0, 12) == $prefix && strpos($string, -1, 12) == $suffix && my_base64_encode(my_base64_decode($string)) == $string && strlen($string)%4 == 0){
    return true;
  } else {
    return false;
  }
}

나는 우연히 해결책을 찾았다.

사용하시는 분base64_encode(base64_decode('xxx'))test와 같은 문자열을 확인할 수 없는 경우가 있습니다.

유효하지 않은 베이스 64 문자열이base64_decode()돌려받지 않고false, 당신이 시도하면 그것은 죽는다.json_encode()어쨌든.이는 디코딩된 문자열이 잘못되었기 때문입니다.
따라서 이 방법을 사용하여 유효한 base 64 부호화 문자열을 확인합니다.

여기 암호가 있습니다.

/**
 * Check if the given string is valid base 64 encoded.
 *
 * @param string $string The string to check.
 * @return bool Return `true` if valid, `false` for otherwise.
 */
function isBase64Encoded($string): bool
{
    if (!is_string($string)) {
        // if check value is not string.
        // base64_decode require this argument to be string, if not then just return `false`.
        // don't use type hint because `false` value will be converted to empty string.
        return false;
    }

    $decoded = base64_decode($string, true);
    if (false === $decoded) {
        return false;
    }

    if (json_encode([$decoded]) === false) {
        return false;
    }

    return true;
}// isBase64Encoded

여기 테스트 코드가 있습니다.

// each tests value must be 'original string' => 'base 64 encoded string'
$testValues = [
    555 => 'NTU1',
    5555 => 'NTU1NQ==',
    'hello' => 'aGVsbG8=',
    'สวัสดี' => '4Liq4Lin4Lix4Liq4LiU4Li1',
    'test' => 'dGVzdA==',
];


foreach ($testValues as $invalid => $valid) {
    if (isBase64Encoded($invalid) === false) {
        echo '<strong>' . $invalid . '</strong> is invalid base 64<br>';
    } else {
        echo '<strong style="color:red;">Error:</strong>';
        echo '<strong>' . $invalid . '</strong> should not be valid base 64<br>';
    }

    if (isBase64Encoded($valid) === true) {
        echo '<strong>' . $valid . '</strong> is valid base 64<br>';
    } else {
        echo '<strong style="color:red;">Error:</strong>';
        echo '<strong>' . $valid . '</strong> should not be invalid base 64<br>';
    }

    echo '<br>';
}

테스트 결과:

555는 잘못된 기준 64입니다.
NTU1은 유효한 베이스 64입니다.

5555는 잘못된 기준 64입니다.
NTU1NQ==는 유효한 기준 64입니다.

hello는 잘못된 기본 64입니다.
aGVsbG8=이(가) 유효한 기준 64입니다.

「」는 무효인 베이스 64입니다.
4Liq4Lin4Lix4Liq4LiU4Li1은 유효한 베이스 64입니다.

테스트가 잘못된 기본 64입니다.
dGVZdA==는 유효한 기준 64입니다.

누군가가 클리핑된 base64 를 송신했는지, 또는 이미지가 아닌지를 에러 없이 검증하려면 , 이 함수를 사용해 base64 를 체크해, 그것이 정말로 이미지인지 아닌지를 확인합니다.

function check_base64_image($base64) {
try {
    if (base64_encode(base64_decode($base64, true)) === $base64) {
        $img = imagecreatefromstring(base64_decode($base64, true));
        if (!$img) {
            return false;
        }
        imagepng($img, 'tmp.png');
        $info = getimagesize('tmp.png');
        unlink('tmp.png');
        if ($info[0] > 0 && $info[1] > 0 && $info['mime']) {
            return true;
        }
    }
} catch (Exception $ex) {
    return false;
} }

저는 이 방법을 사용하고 있습니다.마지막 두 글자는 ==이어야 합니다.

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

업데이트: 위의 항목이 base64_decode($buff, true)에 실패하면 다시 체크하게 됩니다.

데이터가 유효한 base64가 아닌 경우 함수 base64_decode($string, true)는 FALSE를 반환합니다.

언급URL : https://stackoverflow.com/questions/4278106/how-to-check-if-a-string-is-base64-valid-in-php

반응형