PHP序列化带有错误字符数的受保护类变量?

时间:2016-05-26 18:15:00

标签: php object-serialization

我正在处理PHP 5.2.6中的一个奇怪的问题,序列化对象。

显然,PHP存储受保护变量成员,并在其名称前面加上一个星号。这是正常和正确的,但请看下面的例子:

O:18:"object__songChords":1:{s:9:"*chords"}

*和弦不包含9个字符,但包含7个字符(使用星号)。

当然,我认为我身边存在一些误解,并且PHP只计算引号,但当我将其与存储的其他字符串进行比较时,我发现情况并非如此。

Bottomline是PHP无法反序列化这些对象,尽管这些类没有改变。

Notice: unserialize(): Error at offset 43 of 867 bytes in ...

有人能提供一些见解吗?

编辑(提供课程)

class object__songChords {
  protected $chords;
  protected $lyrics;
}

请注意,为了简单起见,我删除了上面的序列化示例 - 实际的序列化字符串当然包含两个属性。

1 个答案:

答案 0 :(得分:3)

计数没有关闭,有\0个空字符分隔*,每边一个:

$o = new object__songChords;
echo addslashes(serialize($o));

收率:

O:18:\"object__songChords\":2:{s:9:\"\0*\0chords\";N;s:9:\"\0*\0lyrics\";N;}