web-dev-qa-db-ja.com

PHPで文字列がbase64で有効かどうかを確認する方法

文字列があり、PHP=が有効なbase64エンコードかどうかをテストします。

52
Alias

これは古いトピックであることに気づきましたが、strictパラメーターを使用しても必ずしも役立つとは限りません。

「base 64でエンコードされていません」などの文字列で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';
}
93
PottyBert

この機能を使用できます:

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

文字列が有効でない場合、デコード関数はFALSEを返すため、このコードは機能するはずです。

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

ドキュメント でbase64_decode関数の詳細を読むことができます。

12
EdoDodo

それを行う唯一の方法は、 base64_decode()$strictパラメータをtrueに設定し、falseを返すかどうかを確認します。

7
Pekka 웃

文字列に対してのみ、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;
}
7
merlucin

これは非常に古い質問ですが、次のアプローチが実質的に防弾であることがわかりました。また、検証時に例外を引き起こす無効な文字を含む奇妙な文字列も考慮に入れます。

    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に適合させました。

3
Lucio Mollinedo

私はこの方法が私のプロジェクトで完璧に機能していると書いています。 base64 Imageをこのメソッドに渡すと、有効な場合はtrueを返し、そうでない場合はfalseを返します。試してみて、間違ったことを教えてください。機能を編集して学習します。

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

私は次を試しました:

  • base64は、strictパラメータをtrueに設定して文字列をデコードします。
  • base64は、前のステップの結果をエンコードします。結果が元の文字列と同じでない場合、元の文字列はbase64でエンコードされていません
  • 結果が前の文字列と同じ場合、デコードされた文字列に印刷可能な文字が含まれているかどうかを確認します。 php関数 ctype_print を使用して、印刷できない文字をチェックしました。入力文字列に1つ以上の印刷できない文字が含まれている場合、関数は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エンコード文字列である場合があります。これは、jsonの文字数が4の倍数であり、すべての文字がbase64エンコード文字列の許容範囲内にあるためです。元の文字列の許可された文字の範囲を知ってから、デコードされたデータにそれらの文字があるかどうかを確認する必要があるようです。

0
Nadir Latif

私は非常に古い質問に頼ることを知っており、提案されたすべての方法を試しました。私は最終的に、ほぼすべての私のケースをカバーするこの正規表現になります:

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

文字列をbase64_decode($ strictをTRUEに設定)で送信するだけで、入力が無効な場合はFALSEを返します。

F.iも使用できます。正規表現は、文字列にbase64アルファベット以外の文字が含まれているかどうかを確認し、末尾に適切な量のパディング(=文字)が含まれているかどうかを確認します。ただし、base64_decodeを使用する方がはるかに簡単であり、不正な形式の文字列が害を及ぼすリスクはありません。

0
Wim

base64でエンコードされたデータが有効でない場合、base64_decode()はfalseを返す必要があります。

0
Scoop

古いトピックですが、私はこの機能を見つけており、機能しています:

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

シンタキシーをチェックする画像を検証するソリューションをコーディングします

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

しかし、安全な方法は Intervention を使用することです

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