Sim*_*ine 13
(实际答案.)不要使用正则表达式.使用base64_decode()可选$strict参数set解码您的字符串true,看它是否与您期望的格式匹配.或者只是在它允许的情况下尝试解码它多次.例如:
function base64_decode_multiple(string $data, int $count = 2) {
while ($count-- > 0 && ($decoded = base64_decode($data, true)) !== false) {
$data = $decoded;
}
return $data;
}
Run Code Online (Sandbox Code Playgroud)
(理论上的答案.)双基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>?
Run Code Online (Sandbox Code Playgroud)
您还可以使用正则表达式确定某些内容是否使用base64编码两次,但解决方案并非简单或漂亮,因为一次检查4个字节是不够的.
示例: "QUFBQQ =="base64解码为"AAAA",base64解码为三个NUL字节:
$ echo -n "QUFBQQ==" | base64 -d | xxd
00000000: 4141 4141 AAAA
$ echo -n "AAAA" | base64 -d | xxd
00000000: 0000 00 ...
Run Code Online (Sandbox Code Playgroud)
此时我们可以枚举所有的base-base64编码,其中base64编码是4个字节("AAAA","AAAB","AAAC","AAAD"等)并最小化:
<ugly 4> := QUFBQQ== | QUFBQg== | QUFBQw== | QUFBRA== | ...
Run Code Online (Sandbox Code Playgroud)
我们可以枚举所有双base64编码的前4个字节,其中base64编码为8个字节或更长(不涉及的情况=)并最小化:
<chunk 4> := QUFB | QkFB | Q0FB | REFB | ...
Run Code Online (Sandbox Code Playgroud)
一个双base64编码的字符串的分区(漂亮的一个)=最后不包含s; 它们的长度是8的倍数:
<pretty double-base64-encoded> := <chunk 4>{2}*
Run Code Online (Sandbox Code Playgroud)
双base64编码字符串的另一个分区的长度是4的倍数但不是8(4,12,20等); 他们可以被认为是漂亮的,最后有点丑陋:
<ugly double-base64-encoded> := <chunk 4>{2}* <ugly 4>
Run Code Online (Sandbox Code Playgroud)
然后我们可以构造一个组合正则表达式:
<double-base64-encoded> := <pretty double-base64-encoded>
| <ugly double-base64-encoded>
Run Code Online (Sandbox Code Playgroud)
正如我所说,你可能不想仅仅因为双base64编码的消息是常规的而经历所有这些混乱.就像你不想检查一个整数是否在某个区间内.此外,这是一个很好的例子,当你应该问另一个问题时得到错误的答案.:-)
关于提出上述模式的一些想法:
由于每个base64编码的字符串都有4个字节的倍数,因此每个double-base64编码的字符串必须解码为4个字节的倍数.因此,例如,"AAAA"不能进行双基64解码,因为它只解码为3个字节.你如何确定某些东西解码为4个字节的倍数?
当消息的长度不是3的倍数时,base64编码的字符串将向下舍入到4个字符的下一个倍数.例如,编码"AAAA","AAAAA"和"AAAAAA"都需要8个字节.
另一个例子: "QUFBIQ =="base64-decodes to"AAA!",这不是有效的base64编码; 有四个字节,但"!" 不在base64表中.
由于每个base64编码的字符串都匹配[A-Za-z0-9+/]{4}(最后四个字节是特殊情况),因此双base64编码的字符串只能使用4字节的子集来描述它们.什么子集?
我们知道"QUFBQQ =="是一个有效的双base64编码,而"QUFB"部分始终是前三个"A".但它们只是有效的双base64编码的一部分,后面跟着一个编码为单个字符匹配的东西[A-Za-z0-9+/]; "QQ =="解码为"A",这样很好.
| 归档时间: |
|
| 查看次数: |
3161 次 |
| 最近记录: |