检测 PHP 中的 base64 编码?

2022-08-30 13:02:05

有没有办法检测一个字符串是否在PHP中被base64_encoded()?

我们正在将一些存储从纯文本转换为base64,其中一部分存储在需要更新的cookie中。如果文本尚未编码,我想重置他们的cookie,否则不要管它。


答案 1

对于一个已经回答过的问题的延迟回答,我很抱歉,但我不认为base64_decode($x,true)是解决这个问题的足够好的解决方案。事实上,可能没有一个很好的解决方案可以反对任何给定的输入。例如,我可以将许多坏值放入$x,而不会得到错误的返回值。

var_dump(base64_decode('wtf mate',true));
string(5) "���j�"

var_dump(base64_decode('This is definitely not base64 encoded',true));
string(24) "N���^~)��r��[jǺ��ܡם"

我认为除了严格的返回值检查之外,您还需要进行解码后验证。最可靠的方法是,您可以解码,然后检查一组已知的可能值。

一种准确性低于 100% 的更通用的解决方案是,如果您检查输出以查看许多字符是否超出 utf-8(或您使用的任何编码)字符的正常范围。

请参阅此示例:

<?php
$english = array();
foreach (str_split('az019AZ~~~!@#$%^*()_+|}?><": Iñtërnâtiônàlizætiøn') as $char) {
  echo ord($char) . "\n";
  $english[] = ord($char);
}
  echo "Max value english = " . max($english) . "\n";

$nonsense = array();
echo "\n\nbase64:\n";
foreach (str_split(base64_decode('Not base64 encoded',true)) as $char) {
  echo ord($char) . "\n";
  $nonsense[] = ord($char);
}

  echo "Max nonsense = " . max($nonsense) . "\n";

?>

结果:

Max value english = 195
Max nonsense = 233

所以你可以做这样的事情:

if ( $maxDecodedValue > 200 ) {} //decoded string is Garbage - original string not base64 encoded

else {} //decoded string is useful - it was base64 encoded

您可能应该使用解码值的means()而不是max(),我刚刚在此示例中使用了max(),因为可悲的是PHP中没有内置的meanst()。您针对什么阈值(例如200)使用什么度量(平均值,最大值等)取决于您的估计使用情况配置文件。

总之,唯一成功的举动就是不玩。我会尽量避免首先辨别base64。


答案 2
function is_base64_encoded($data)
{
    if (preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $data)) {
       return TRUE;
    } else {
       return FALSE;
    }
};

is_base64_encoded("iash21iawhdj98UH3"); // true
is_base64_encoded("#iu3498r"); // false
is_base64_encoded("asiudfh9w=8uihf"); // false
is_base64_encoded("a398UIhnj43f/1!+sadfh3w84hduihhjw=="); // false

http://php.net/manual/en/function.base64-decode.php#81425


推荐