如何检查一个字符串是否在PHP中是base64有效
我想做到这一点的唯一方法是与$strict
参数设置做了base64_decode()
到true
,看看它是否返回false
。
制作CW因为这是一个双重骗局 – 2010-11-25 14:41:14
这很有效!谢谢 – Alias 2010-11-25 15:50:59
您只需通过base64_decode
(将$ strict设置为TRUE)发送字符串,如果输入无效,它将返回FALSE。
您也可以使用f.i.正则表达式查看该字符串是否包含base64字母以外的任何字符,并检查它是否在末尾包含正确数量的填充(=
个字符)。但是使用base64_decode要容易得多,并且不应该有造成任何伤害的错误字符串的风险。
如果您的base64编码数据无效,base64_decode()应返回false。
如果数据无效base64,则函数base64_decode($ string,true)将返回FALSE。
声明是不正确的。 正如文档所述:“如果$ string s无效base64,那么函数base64_decode($ string,true)将返回FALSE”。 因此,例如“ciao”等一些无效的base64字符串将被解码为“r& ” – m47730 2016-04-28 16:37:21
此代码应工作,因为解码函数返回FALSE如果字符串是无效的:
if (base64_decode($mystring, true)) {
// is valid
} else {
// not valid
}
你可以阅读更多关于the documentation的BASE64_DECODE功能。
downvote,因为这不是确定字符串是否编码为base64的正确方法。它只检查字符串是否具有base64字母以外的字符。正如克里斯所说,字符串“我不是基本64编码”不会返回false这种方法。 – Maurice 2012-11-07 14:33:11
莫里斯在这里是正确的。请**不要依赖这个答案**。这是不正确的,不会确定一个字符串是否是base64编码的。从文档:`strict:如果输入包含来自base64字母之外的字符,则返回FALSE。“我不知道为什么PHP决定以这种方式处理它,但不管它是否真正检测到base64编码。克里斯的回答是正确的。 – 2013-01-03 23:26:29
我意识到这是一个老话题,但使用严格的参数不一定会帮助。
对诸如“我不是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';
}
您可以使用这个功能:
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;
}
我正在使用这种方法。该公司预计最后的2个字符被==
substr($buff, -2, 1) == '=' && substr($buff, -1, 1) == '=')
更新:我结束了做另一项检查,如果上面的一个失败 BASE64_DECODE($的buff,真)
只为字符串,你可以使用此功能,即返回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;
}
}
我从this page得到了想法,并将它改编为PHP。
我知道我诉诸一个非常古老的问题,我尝试了所有提出的方法;我终于结束了这个正则表达式,涵盖几乎所有的我的情况:
$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;
}
我试过如下:
- 的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编码字符串的允许范围内。看来我们必须知道原始字符串的允许字符范围,然后检查解码数据是否有这些字符。
这可能是重复的。 – Gumbo 2010-11-25 14:33:19
可能的重复项: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