如何检查一个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)