如何在PHP中检查字符串是否为base64有效

Ali*_*ias 55 php validation base64

我有一个字符串,并希望使用PHP进行测试,如果它是有效的base64编码.

Pot*_*ert 100

我意识到这是一个古老的话题,但使用严格的参数并不一定会有所帮助.

在诸如"我不是base 64编码"之类的字符串上运行base64_decode将不会返回false.

但是,如果您尝试使用strict对字符串进行解码并使用base64_encode对其进行重新编码,则可以将结果与原始数据进行比较,以确定它是否是有效的bas64编码值:

if ( base64_encode(base64_decode($data, true)) === $data){
    echo '$data is valid';
} else {
    echo '$data is NOT valid';
}
Run Code Online (Sandbox Code Playgroud)

  • @Sam那是因为"test"是一个完美的base64字符串.它只使用base64个字符(az,AZ,0-9),它的长度可以被4整除.这些是有效base64字符串的唯一要求.进入"测试"时你期望发生什么? (4认同)
  • 谈论“老话题”,好吧..我们已经到了 2022 年,10 年后仍在寻找这个:)) (2认同)

Veg*_*ega 20

你可以使用这个功能:

 function is_base64($s)
{
      return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s);
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是最接近检测这一点的最佳方法。base64_decode(<字符串, True); 会解码任何事情,即使它不正确。不过,这里可能还可以添加更多内容。 (2认同)
  • 我会在这里留下注释:小心正则表达式主题最大大小 https://secure.php.net/manual/en/pcre.constants.php#118538 在 PHP 7 中至少你无法检查这样的 base64 编码图像(使用默认 PHP 设置) (2认同)

Edo*_*odo 10

此代码应该有效,因为如果字符串无效,则decode函数返回FALSE:

if (base64_decode($mystring, true)) {
    // is valid
} else {
    // not valid
}
Run Code Online (Sandbox Code Playgroud)

您可以在文档中阅读有关base64_decode函数的更多信息.

  • downvote因为这不是确定字符串是否编码为base64的正确方法.它只检查字符串是否包含base64字母表之外的字符.正如Kris所说,字符串"我不是64位编码"并不会使用此方法返回false. (24认同)
  • 莫里斯在这里是对的.请**不要依赖这个答案**.它不正确,不会确定字符串是否为base64编码.来自文档:`strict:如果输入包含来自base64字母表之外的字符,则返回FALSE.我不知道为什么PHP决定以这种方式处理它,但无论如何,它并不真正检测base64编码.克里斯的回答是正确的. (5认同)

Pek*_*ica 7

我认为唯一的方法是base64_decode()使用$strict参数设置为true,并查看它是否返回false.

  • 由于与另一个类似答案相同的原因而投反对票:“它只检查字符串是否包含 base64 字母表之外的字符。” (3认同)

mer*_*cin 7

仅对于字符串,您可以使用此函数,该函数在返回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;
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些考虑使用 Andrew 代码行的人,在后端(代码不在浏览器中运行)我建议易读性(同时保持性能)与同一行中的所有代码相比。并使用评论!不要增加技术债务! (2认同)

Wim*_*Wim -1

您可以直接发送字符串base64_decode($strict 设置为 TRUE),如果输入无效,它将返回 FALSE。

您还可以使用 fi 正则表达式查看字符串是否包含 base64 字母表之外的任何字符,并检查它是否在末尾包含正确数量的填充(=字符)。但仅使用 base64_decode 就容易得多,并且不应该存在格式错误的字符串造成任何损害的风险。