2010-11-25 65 views
42

我有一个字符串,并希望使用PHP进行测试,如果它是一个有效的base64编码或不是。如何检查一个字符串是否在PHP中是base64有效

+0

这可能是重复的。 – Gumbo 2010-11-25 14:33:19

+1

可能的重复项:http://stackoverflow.com/questions/2556345/detect-base64-encoding-in-php,http://stackoverflow.com/questions/271657/how-to-tell-if-a-string- is-base64-or-not,et al。 – Gumbo 2010-11-25 14:36:38

回答

6

我想做到这一点的唯一方法是与$strict参数设置做了base64_decode()true,看看它是否返回false

+0

制作CW因为这是一个双重骗局 – 2010-11-25 14:41:14

+0

这很有效!谢谢 – Alias 2010-11-25 15:50:59

0

您只需通过base64_decode(将$ strict设置为TRUE)发送字符串,如果输入无效,它将返回FALSE。

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

0

如果您的base64编码数据无效,base64_decode()应返回false。

-1

如果数据无效base64,则函数base64_decode($ string,true)将返回FALSE。

+1

声明是不正确的。 正如文档所述:“如果$ string s无效base64,那么函数base64_decode($ string,true)将返回FALSE”。 因此,例如“ciao”等一些无效的base64字符串将被解码为“r& ” – m47730 2016-04-28 16:37:21

9

此代码应工作,因为解码函数返回FALSE如果字符串是无效的:

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

你可以阅读更多关于the documentation的BASE64_DECODE功能。

+20

downvote,因为这不是确定字符串是否编码为base64的正确方法。它只检查字符串是否具有base64字母以外的字符。正如克里斯所说,字符串“我不是基本64编码”不会返回false这种方法。 – Maurice 2012-11-07 14:33:11

+5

莫里斯在这里是正确的。请**不要依赖这个答案**。这是不正确的,不会确定一个字符串是否是base64编码的。从文档:`strict:如果输入包含来自base64字母之外的字符,则返回FALSE。“我不知道为什么PHP决定以这种方式处理它,但不管它是否真正检测到base64编码。克里斯的回答是正确的。 – 2013-01-03 23:26:29

76

我意识到这是一个老话题,但使用严格的参数不一定会帮助。

对诸如“我不是base 64编码的”字符串运行base64_decode不会返回false。

然而,如果你试图用BASE64_ENCODE严格和重新编码字符串解码,您可以将结果与原始数据进行比较,以确定它是否是一个有效的bas64编码值:

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

它不适用于字符串:'节点'! – Amir 2013-10-22 09:03:07

+0

为什么这不起作用?字符串'节点'编码为bm9kZQ ==(我测试过) – PottyBert 2013-11-06 15:33:13

18

您可以使用这个功能:

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

老话题,但我发现这个功能和它的工作:

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

我正在使用这种方法。该公司预计最后的2个字符被==

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

更新:我结束了做另一项检查,如果上面的一个失败 BASE64_DECODE($的buff,真)

4

只为字符串,你可以使用此功能,即返回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; 
} 
2

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

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

} 

我从this page得到了想法,并将它改编为PHP。

0

我知道我诉诸一个非常古老的问题,我尝试了所有提出的方法;我终于结束了这个正则表达式,涵盖几乎所有的我的情况:

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

基本上我检查每一个不打印(文字:图:)不是空格或制表符(\ 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; 
} 
0

我试过如下:

  • 的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编码字符串的允许范围内。看来我们必须知道原始字符串的允许字符范围,然后检查解码数据是否有这些字符。

相关问题