如何检查字符串在PHP中是否base64有效

如何检查字符串在PHP中是否base64有效,php,validation,base64,Php,Validation,Base64,我有一个字符串,想用PHP测试它是否是有效的base64编码。我认为唯一的方法是将$strict参数设置为true,然后查看它是否返回false您可以通过base64\u decode(将$strict设置为true)发送字符串,如果输入无效,它将返回FALSE 您还可以使用f.i.正则表达式查看字符串是否包含base64字母表之外的任何字符,并检查其结尾是否包含正确的填充量(=字符)。但是仅仅使用base64_decode要容易得多,而且不应该有格式错误的字符串造成任何伤害的风险。base64

我有一个字符串,想用PHP测试它是否是有效的base64编码。

我认为唯一的方法是将
$strict
参数设置为
true
,然后查看它是否返回
false

您可以通过
base64\u decode
(将$strict设置为true)发送字符串,如果输入无效,它将返回FALSE


您还可以使用f.i.正则表达式查看字符串是否包含base64字母表之外的任何字符,并检查其结尾是否包含正确的填充量(
=
字符)。但是仅仅使用base64_decode要容易得多,而且不应该有格式错误的字符串造成任何伤害的风险。

base64_decode()应该在base64编码的数据无效时返回false。

如果base64编码的数据无效,则函数($string,true)将返回false。

此代码应该可以工作,如果字符串无效,解码函数将返回FALSE:

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

您可以在中阅读有关base64_解码函数的更多信息。

我意识到这是一个老话题,但使用strict参数不一定会有帮助

对字符串(如“I'm not 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);
}

旧主题,但我发现了这个函数,它正在工作:

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;
}
函数checkBase64Encoded($encodedString){
$length=strlen($encodedString);
//检查每个字符。
对于($i=0;$i<$length;++$i){
$c=$encodedString[$i];
如果(
($c<'0'|$c>'9')
&&($c<'a'|$c>'z')
&&($c<'A'|$c>'Z')
&&($c!='+'))
&&($c!='/'))
&&($c!='=')
) {
//发现坏字符。
返回false;
}
}
//只找到好角色。
返回true;
}

我正在使用这种方法。它希望最后2个字符为==

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

更新:我最后做了另一个检查,如果上面的一个失败
base64_decode($buff,true)

仅对于字符串,您可以使用此函数,在返回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;
}

这是一个非常古老的问题,但我发现以下方法实际上是防弹的。它还考虑了那些带有无效字符的奇怪字符串,这些字符串在验证时会导致异常

    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中得到了这个想法,并将其应用于PHP。

我知道我求助于一个非常古老的问题,我尝试了所有提出的方法;我最终得到了这个正则表达式,它几乎涵盖了我所有的案例:

$decoded = base64_decode($string, true);
if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false;
$decoded=base64\u decode($string,true);
如果(0
基本上,我检查每个不可打印的字符(:graph:)是否不是空格或制表符(\s),是否不是unicode字母(所有重音都是:èùì等)

我仍然对这些字符有误报:§“但我从不在字符串中使用它们,对我来说,完全可以使它们无效。 我用@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;
}
函数是\u base64($s)
{
//检查是否有有效的base64字符
如果(!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/',$s))返回false;
//在严格模式下解码字符串并检查结果
$decoded=base64_decode($s,true);
if(false===$decoded)返回false;
//如果返回的字符串包含不可打印的字符
如果(0
我尝试了以下方法:

  • base64解码strict参数设置为true的字符串
  • base64对上一步的结果进行编码。如果结果与原始字符串不同,则原始字符串不是base64编码的
  • 如果结果与前一个字符串相同,则检查解码的字符串是否包含可打印字符。我使用php函数检查不可打印的字符。如果输入字符串包含一个或多个不可打印字符,则函数返回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编码字符串允许的范围内。似乎我们必须知道原始字符串允许的字符范围,然后检查解码数据是否包含这些字符。

我编写了一个解决方案来验证图像检查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";
但一种安全的方法是使用


我写的这个方法在我的项目中非常有效。将base64映像传递到此方法时,如果它有效,则返回true,否则返回false。让我们试着让我知道任何错误。我将在功能中编辑和学习

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

这里的大多数答案都不可靠

事实上,没有可靠的答案,因为许多非base64编码的文本可以像base64编码的文本一样读取,所以没有默认的方法来确定

此外,值得注意的是,base64_decode将解码许多无效字符串 对于exmaple,
不是有效的base64编码,但base64\u decode将对其进行解码。具体为
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;
  }
}

好了,伙计们。。。终于有了
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;
  }
}
    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;
    }
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;
  }

}