【问题标题】:Avoid null bytes in php serialize()避免 php serialize() 中的空字节
【发布时间】:2017-09-29 13:51:50
【问题描述】:

我正在使用 php serialize() 序列化 php 对象。但是,它会在结果中为受保护的成员变量添加空字节。然后将该结果作为消息传递给 Amazon SQS 队列。问题是 SQS 不支持消息正文中的空字节。有没有办法摆脱空字节。我必须确保结果在另一端仍然是不可序列化的。

【问题讨论】:

  • 用base64编码序列化对象?大小增加了 4/3 倍(编码前的三个字节产生约 4 字节的 base64),但这是通过 SQS 等非 8 位干净或假设的传输发送二进制数据的事实上的标准有效负载由字符而不是任意八位字节组成。根据定义,在另一端解码 base64 应该恢复相同的数据。

标签: php serialization amazon-sqs


【解决方案1】:

我在尝试序列化对象时遇到了同样的问题。

正如Michael - sqlbot 评论中所解释的,base64_encode 函数正在正确处理 NUL 字节。

在“序列化”方面你应该这样做:

base64_encode(serialize($object));

在“反序列化”方面:

base64_decode(unserialize($object));

如果你想知道serialize 函数内部是如何工作的,你可以阅读 PHP Internals Book: Serialization:

上述序列化字符串中的\0为NUL字节。正如您所见,私有成员和受保护成员使用相当特殊的名称进行序列化:私有属性以 \0ClassName\0 为前缀,而受保护的属性则以 \0*\0 为前缀。这些名称是名称修改的结果,我们将在后面的部分中介绍。

【讨论】:

  • 反序列化端不应该是 unserialize(base64_decode($object)) 吗?
猜你喜欢
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多