如何检查一个string是否在PHP中是base64有效的

我有一个string,并希望使用PHPtesting,如果它是一个有效的base64编码或不。

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

在string上运行base64_decode,例如“我不是base 64编码”,不会返回false。

但是,如果您尝试严格解码string并使用base64_encode对其进行重新编码,则可以将结果与原始数据进行比较,以确定它是否是有效的bas64编码值:

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

你可以使用这个function:

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

此代码应该工作,因为如果string无效,则解码函数返回FALSE:

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

您可以在文档中阅读有关base64_decodefunction的更多信息。

我认为唯一的方法是做一个base64_decode() ,将$strict参数设置为true ,看看它是否返回false

只是为了string,你可以使用这个函数,在返回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; } 

这是一个非常古老的问题,但我发现以下方法实际上是防弹的。 它也考虑到那些奇怪的string与无效的字符,当validation时会导致exception。

  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_decode发送string($ strict设置为TRUE),如果input无效,则返回FALSE。

您还可以使用fi正则expression式查看该string是否包含base64字母以外的任何字符,并检查它是否包含在末尾( =字符)的正确数量的填充。 但是使用base64_decode要容易得多,而且不应该有string格式不正确的风险。

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

老主题,但我已经find了这个function,它的工作:

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

我知道我提出了一个很老的问题,我尝试了所有提出的方法。 我终于结束了这个几乎涵盖所有情况的正则expression式:

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

基本上,我检查每个不可打印的字符(:图表:)不是一个空格或制表符(\ s),不是一个Unicode字母(所有的口音例如:èéùìà等)

我仍然得到这个字符的误判:但是我从来没有把它们用在一个string中,对我来说完全可以使它们失效。 我将这个检查与@merlucin提出的function进行汇总

所以结果是:

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

我尝试了以下内容:

  • base64将严格的参数设置为true来解码string。
  • base64编码上一步的结果。 如果结果与原始string不相同,则原始string不是base64编码的
  • 如果结果与之前的string相同,则检查解码后的string是否包含可打印的字符。 我使用php函数ctype_print来检查不可打印的字符。 如果inputstring包含一个或多个不可打印字符,则函数返回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; } 

上面的代码可能会返回意外的结果。 例如,对于string“json”它将返回false。 “json”可能是一个有效的base64编码的string,因为它具有的字符数是4的倍数,并且所有字符都在base64编码string的允许范围内。 看来我们必须知道原始string的允许字符的范围,然后检查解码数据是否具有这些字符。

如果数据不是有效的base64那么函数base64_decode ($ string,true)将返回FALSE。

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

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

更新:我结束了做另一个检查,如果上述失败base64_decode($ buff,true)