基于PHP的网站向我返回了base64编码的字符串,该字符串是序列化数据的base64编码。当我手动对解码的字符串进行base64编码时,会得到不同的结果。
因此,我进一步研究了它,发现序列化的数据包含空字节。
Base64编码的字符串:
TzoxMDoiRXhwcmVzc2lvbiI6Mzp7czoxNDoiAEV4cHJlc3Npb24Ab3AiO3M6MzoiZGl2IjtzOjE4OiIARXhwcmVzc2lvbgBwYXJhbiMi2Y7ZiO1M7E7Z1O2E6Mjp7Z1O2M6E2M7E7Z1O3E6E7M1E7M6E7M1E7M6E7M6E7M6E7M6E7M6E7M6E7M6E7M6E7M6E7E7M0E7E7M0E7E7M0E0E0E0E0E0B,作用;
下面是base64解码字符串的十六进制转储:
$ echo "TzoxMDoiRXhwcmVzc2lvbiI6Mzp7czoxNDoiAEV4cHJlc3Npb24Ab3AiO3M6MzoiZGl2IjtzOjE4OiIARXhwcmVzc2lvbgBwYXJhbXMiO2E6Mjp7aTowO2Q6ODtpOjE7ZDoyO31zOjk6InN0cmluZ2lmeSI7czo1OiI4IC8gMiI7fQ==" | base64 -D | hexdump -C
00000000 4f 3a 31 30 3a 22 45 78 70 72 65 73 73 69 6f 6e |O:10:"Expression|
00000010 22 3a 33 3a 7b 73 3a 31 34 3a 22 00 45 78 70 72 |":3:{s:14:".Expr|
00000020 65 73 73 69 6f 6e 00 6f 70 22 3b 73 3a 33 3a 22 |ession.op";s:3:"|
00000030 64 69 76 22 3b 73 3a 31 38 3a 22 00 45 78 70 72 |div";s:18:".Expr|
00000040 65 73 73 69 6f 6e 00 70 61 72 61 6d 73 22 3b 61 |ession.params";a|
00000050 3a 32 3a 7b 69 3a 30 3b 64 3a 38 3b 69 3a 31 3b |:2:{i:0;d:8;i:1;|
00000060 64 3a 32 3b 7d 73 3a 39 3a 22 73 74 72 69 6e 67 |d:2;}s:9:"string|
00000070 69 66 79 22 3b 73 3a 35 3a 22 38 20 2f 20 32 22 |ify";s:5:"8 / 2"|
00000080 3b 7d |;}|
如您所见,它包含空字节。
那么,如果字符串包含空字节,该如何对这样的字符串进行base64编码?
我想对序列化数据进行一些修改,然后再次对其进行base64编码。
在编码之前如何在字符串中包含空字节?
根据我的理解,因为字符串在PHP和Python中以空字节终止。
如果我用PHP表示如下所示的字符串并对其进行base64编码,则会得到错误的结果。
$ t =“ O:10:”表达式“:3:{s:14:” \ 0Expression \ 0op“; s:3:” div“; s:18:” \ 0Expression \ 0params“; a: 2:{i:0; d:8; i:1; d:2;} s:9:“ stringify”; s:5:“ 8/2”;}“
我使用\ 0表示空字节,但是看起来这不是空字节的正确表示。
用PHP或Python解决方案会很棒。
谢谢。