微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP严格反序列化

我有一个拼写错误的类存储在MemCached中.这是一个例子:

class Person { public $n1ame; }
echo serialize(new Person());

我在下一个代码版本中修复了拼写错误

class Person { public $name; }
var_dump(unserialize($prevIoUsSerializedPersion));

但这是发生的事情:PHP隐式地将未存在的字段添加到我的对象:

object(Person)#1 (2) {
  ["name"]=>
  NULL
  ["n1ame"]=>
  NULL
}

我的人有额外的数据字段.我所期待的是一个例外.

有没有办法实现这一目标?

解决方法:

三点建议:

1.)在调用unserialize()之前,对序列化数据字符串执行手动字符串转换以更正它.

O:6:"Person":1:{s:5:"n1ame";N;}

s:5是原始序列化中属性n1ame的字符长度,您需要将其更改为s:4以将其恢复为名称,s为字符串数据类型,数字为文本的长度值,在这种情况下是属性键.

O:6:"Person":1:{s:4:"name";N;}

你可以试试

unserialize( str_replace( 's:5:"n1ame"', 's:4:"name"', $prevIoUsSerializedPersion ) );

2.)另一种解决方案是__wakup()功能来纠正您的数据.这个函数在序列化之后但在分配和使用之前在你的对象上运行,这可能是一个“更好”的解决方案,因为它在代码中干净利落.

class Person
{
  public $name;
  public function __wakeup()
  {
    if( property_exists( $this, 'n1ame' ) )
    {
      $this->name = $this->n1ame;
      unset( $this->n1ame );
    }
  }
}

unserialize('O:6:"Person":1:{s:5:"n1ame";s:4:"mark";}');

3.)使用相同的__wakup()概念但抛出异常.

class Person
{
  public $name;
  public function __wakeup()
  {
    if( property_exists( $this, 'n1ame' ) )
    {
      throw new Exception('oh no this data is bad');
    }
  }
}

unserialize('O:6:"Person":1:{s:5:"n1ame";s:4:"mark";}');

https://3v4l.org/h8pss

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐