【问题标题】:Determine if string is base64-encoded twice确定字符串是否经过两次 base64 编码
【发布时间】:2018-04-04 12:18:39
【问题描述】:

有没有办法判断一个字符串是否被base64编码了两次?

例如,有没有我可以与preg_match 一起使用的正则表达式模式来执行此操作?

【问题讨论】:

  • 我认为您投了反对票,因为这个问题有点误导,需要付出很多努力才能回答;付出很多努力来回答一个不应该被问到的问题会激怒人们。下次您提出问题时,请尽量避免使用X-Y problem

标签: php regex base64


【解决方案1】:

(实用答案。) 不要使用正则表达式。使用设置为truebase64_decode() 的可选$strict 参数解码您的字符串,并查看它是否与您期望的格式匹配。或者只是尝试尽可能多地对其进行解码。例如:

function base64_decode_multiple(string $data, int $count = 2) {
    while ($count-- > 0 && ($decoded = base64_decode($data, true)) !== false) {
        $data = $decoded;
    }
    return $data;
}

(理论答案。) 双基 64 编码字符串 是规则的,因为存在有限数量的字节序列正确地对 base64 编码的消息进行 base64 编码。

您可以检查某些内容是否为 base64 编码一次,因为您可以验证每组四个字符。 base64 编码消息中的最后四个字节可能是一种特殊情况,因为=s 被用作填充。使用正则表达式:

<char>           := [A-Za-z0-9+/]
<end-char>       := [A-Za-z0-9+/=]
<chunk>          := <char>{4}
<end-chunk>      := <char>{2} <end-char>{2} | <char>{3} <end-char>
<base64-encoded> := <chunk>* <end-chunk>?

您还可以使用正则表达式确定某些内容是否为 base64 编码两次,但该解决方案并不简单或漂亮,因为一次检查 4 个字节是不够的。

示例: "QUFBQQ==" base64-decodes to "AAAA" base64-decodes to 3 NUL-bytes:

$ echo -n "QUFBQQ==" | base64 -d | xxd
00000000: 4141 4141                                AAAA

$ echo -n "AAAA" | base64 -d | xxd
00000000: 0000 00                                  ...

此时,我们可以枚举所有双 base64 编码,其中 base64 编码是 base64 字母表中的 4 个字节(“AAAA”、“AAAB”、“AAAC”、“AAAD”等)并将其最小化:

<ugly 4> := QUFBQQ== | QUFBQg== | QUFBQw== | QUFBRA== | ...

我们可以枚举所有双 base64 编码的前 4 个字节,其中 base64 编码为 8 字节或更长(不涉及使用= 填充的情况)并将其最小化:

<chunk 4> := QUFB | QkFB | Q0FB | REFB | ...

双base64编码字符串的一个分区(漂亮的分区)最后不会包含=s;它们的长度是 8 的倍数:

<pretty double-base64-encoded> := <chunk 4>{2}*

双 base64 编码字符串的另一个分区的长度是 4 的倍数,但不是 8(4、12、20 等);他们可以被认为是漂亮的,最后有点难看:

<ugly double-base64-encoded> := <chunk 4>{2}* <ugly 4>

然后我们可以构造一个组合的正则表达式:

<double-base64-encoded> := <pretty double-base64-encoded>
                         | <ugly double-base64-encoded>

正如我所说,您可能不想仅仅因为双 base64 编码的消息 是常规消息而经历所有这些混乱。就像您不想检查整数是否在某个有限区间内一样。此外,这是一个很好的例子,当你应该问另一个问题时得到错误的答案。 :-)

【讨论】:

  • 你知道如何使用java而不是php来实现多重解码吗?我认为我在返回双重编码的 base64 数据的服务器上遇到了类似的问题,但我无法正确地进行双重解码。你可以在这里阅读更多内容stackoverflow.com/questions/69797789/…
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2012-01-24
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多