正则表达式来匹配字符串中的PHP序列化数据

正则表达式来匹配字符串中的PHP序列化数据,php,regex,Php,Regex,我正在用PHP使用Zend Framework 2的会话管理器,希望取消会话数据的序列化,以便更改数据的存储方式。我认为正则表达式是实现这一点的方法,但我不知道如何确保正则表达式适合这种类型的字符串 样本输入: __ZF|a:2:{s:20:"_REQUEST_ACCESS_TIME";d:1099999999.9999999999999999999999;s:6:"_VALID";a:1:{s:25:"Zend\Session\Validator\Id";s:26:"xxxxxxxxxxxxx

我正在用PHP使用Zend Framework 2的会话管理器,希望取消会话数据的序列化,以便更改数据的存储方式。我认为正则表达式是实现这一点的方法,但我不知道如何确保正则表达式适合这种类型的字符串

样本输入:

__ZF|a:2:{s:20:"_REQUEST_ACCESS_TIME";d:1099999999.9999999999999999999999;s:6:"_VALID";a:1:{s:25:"Zend\Session\Validator\Id";s:26:"xxxxxxxxxxxxxxxxxxxxxxxxxx";}}initialized|C:23:"Zend\Stdlib\ArrayObject":403:{a:4:{s:7:"storage";a:3:{s:4:"init";i:1;s:10:"remoteAddr";s:13:"127.000.00.01";s:13:"httpUserAgent";s:114:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";}s:4:"flag";i:2;s:13:"iteratorClass";s:13:"ArrayIterator";s:19:"protectedProperties";a:4:{i:0;s:7:"storage";i:1;s:4:"flag";i:2;s:13:"iteratorClass";i:3;s:19:"protectedProperties";}}}
预期产出:

'__ZF|a:2:{s:20:"_REQUEST_ACCESS_TIME";d:1099999999.9999999999999999999999;s:6:"_VALID";a:1:{s:25:"Zend\Session\Validator\Id";s:26:"xxxxxxxxxxxxxxxxxxxxxxxxxx";}}'
'initialized|C:23:"Zend\Stdlib\ArrayObject":403:{a:4:{s:7:"storage";a:3:{s:4:"init";i:1;s:10:"remoteAddr";s:13:"127.000.00.01";s:13:"httpUserAgent";s:114:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";}s:4:"flag";i:2;s:13:"iteratorClass";s:13:"ArrayIterator";s:19:"protectedProperties";a:4:{i:0;s:7:"storage";i:1;s:4:"flag";i:2;s:13:"iteratorClass";i:3;s:19:"protectedProperties";}}}'
我尝试的是:

$pattern = '/\w+\|.*?}}+/'; // this works for the sample input, but may be too general and certainly won't work for serialized data without a nested array
$pattern = '/\w+\|(a:\d+:{.*?}|o:\d+:\"[a-z0-9_]+\":\d+:{.*?})/'; // doesn't capture the `initialized` data
我被困的地方:

一般来说,我无法找出将
\uuuu ZF
数据与
初始化的
数据分离的最佳方法(特别是当会话中存在其他非Zend变量时)。具体来说,我不知道使用什么正则表达式来获取序列化数据

我试着在RegexPlanet上举一个例子,但无法理解接口,它似乎只会产生奇怪的结果。如果有帮助的话,我可以肯定ZF PHP会生成如下序列化的会话数据:

$text = "";
foreach ($_SESSION as $key => $value) {
    $text .= $key . "|" . serialize($value);
}

…但我还没有找到它的源代码

我发现了ini_集('session.serialize_handler','php_serialize');它将序列化更改为使用PHP的常规序列化方法而不是替代方法,从而解决了问题Miryafa

序列化时,看起来您正在使用JSON格式。不是用正则表达式解决问题,而是尝试用JSON攻击@罗德里戈梅斯我不知道这是JSON。但我认为JSON只是一个特定格式风格的词。特别是,如果我理解正确的话,我想分离的数据部分不是JSON。我如何在这里使用JSON?您最好的选择可能是。@melpomene谢谢您的回复。我试过了,但结果一直是假的。但多亏了你,我发现了ini_集('session.serialize_handler','php_serialize');它将序列化更改为使用PHP的常规序列化方法而不是替代方法,从而解决了问题。