我目前正在处理一个网站,其中我的数据库中存储了混合值,并且我想找到一种解决方案来检测字符串是否为base64加密。在此帖子(Detect base64 encoding in PHP?)上受到Abhinav bhardwaj的帮助,我已经编写了以下代码:
function IsBase64($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;
}
它只能部分地工作,例如像1234、7000、reno和其他四个字母和数字的输入值即使它们不是base64编码也会解析为true...现在我的问题是:是否有可靠的方法来进行base64检测,还是我必须保留未编码和编码表格的列表并将它们视为不同的处理? 我的计划是最终将数据(其中一些需要解密,一些不需要)合并到一个php结果对象中,并将其作为JSON文本返回。任何关于此的帮助都将不胜感激!提前感谢您! 编辑:在Yoshi的回答之后,我想把我的结论钉在顶部,以便其他寻找易于编码/解码特定数据的简单解决方案的人可以看到: 我认为更好的方法是,在数据库中将编码数据保留在特定键下,并在查询数据集结果中查找此特定键是否包含以跟踪需要解密的内容... FYI:我已将我的网站更新为这种行为,我必须承认它的效果非常好!
private function is_base64_encoded($str) { $decoded_str = base64_decode($str); $Str1 = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $decoded_str); if ($Str1!=$decoded_str || $Str1 == '') { return false; } return true; }
- bilal