有没有一种防弹的方法可以检测php中字符串中的base64编码



我目前正在一个网站上工作,我的数据库中存储了混合值,我想找到一个解决方案来检测是否使用base64加密的字符串。到目前为止,在Abhinav bhardwaj的帮助下,我在这篇文章中提出了这段代码(检测PHP中的base64编码?):

function IsBase64($s)
{
// Check if there are valid base64 characters
if (!preg_match('/^[a-zA-Z0-9/rn+]*={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和其他4个字母和数字输入的值即使不是真的,也会被解析为真。。。现在我的问题是:有没有可靠的方法来进行base64检测,或者我必须保留一个未编码和编码表的列表,并对它们进行不同的处理?

我的计划是最终将数据(其中一些需要解密,另一些不需要解密)合并到一个php结果对象中,并将其作为JSON文本返回。

非常感谢在这方面的任何帮助!

提前感谢!

编辑:在Yoshi的回答之后,我想把我的结论放在首位,供其他正在寻找编码/解码特定数据的简单解决方案的人使用:

我认为最好的方法是,将编码的数据保存在数据库中的特定密钥下,并在查询数据集结果中查看是否包含该特定密钥,以跟踪需要解密的内容。。。

仅供参考:我已经将我的网站更新为这种行为,我必须承认它就像一种魅力!

我将发布Yoshi的评论作为最终结论:

我觉得你运气不好。你提到的假阳性仍然是有效的base64编码。你需要判断解码后的版本是否有意义,但这可能是一个永无止境的故事,最终也可能导致误报Yoshi

我发现了一个完美的函数,可以检查字符串是否有有效的base64

返回布尔值True或False

function is_base64($s) {
// Check if there are valid base64 characters
if (!preg_match('/^[a-zA-Z0-9/rn+]*={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;
}

谢谢#merlucin,链接

base64编码的字符串基本上是(A-Z)、(A-Z)、(0-9)加上=到mod 4。因此,任何4的倍数的字母组合都是base64。

function IsBase64($str) {
if (strlen($str) % 4 == 0) {
return true;
} else {
return false;
}
}

最新更新