是否有一种防弹方式来检测php中字符串中的base64编码?

时间:2017-10-26 06:05:41

标签: php json base64 detection

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

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和其他4字母和数字输入的值,即使它们不是......也会解析为真...现在我的问题:是否有任何可靠的方法进行base64检测或我是否必须保留未编码和编码表的列表并将它们区别对待?

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

非常感谢任何帮助!

先谢谢你了!

编辑:在Yoshi的回答之后,我希望将其结论放在其他正在寻找编码/解码特定数据的简单解决方案的人的顶部:

  

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

仅供参考:我已将此网站更新为此行为,我不得不承认它有点像魅力!

3 个答案:

答案 0 :(得分:0)

base64编码的字符串基本上是(A-Z),(a-z),(0-9)填充= = mod 4.所以,4的倍数字母的任何组合都有效为base64。

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

答案 1 :(得分:0)

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

  

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

答案 2 :(得分:0)

我发现了一个完善的功能,该功能检查字符串是否为有效的base64

返回布尔值True或False

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;
}

谢谢 #merlucinLink