在Node.js中反序列化PHP序列化字符串

4

我有一个 PHP 序列化字符串,我使用 php-serialize 或 Node.js 中的 'locutus/php/var/unserialize' 进行反序列化。

"a:2:{s:3:\"$or\";a:1:{i:0;a:1:{s:4:\"$and\";a:1:{i:0;a:1:{s:20:\"attributes.FIRSTNAME\";C:18:\"MongoDB\\BSON\\Regex\":49:{a:2:{s:7:\"pattern\";s:2:\"^a\";s:5:\"flags\";s:1:\"i\";}}}}}}s:4:\"$and\";a:1:{i:0;a:1:{s:3:\"$or\";a:2:{i:0;a:1:{s:8:\"batch_id\";a:1:{s:7:\"$exists\";b:1;}}i:1;a:1:{s:2:\"sc\";a:1:{s:3:\"$ne\";i:-2;}}}}}}"

当我尝试反序列化时,出现错误,提示如下:

SyntaxError: Unknown / Unhandled data type(s): c

我的反序列化代码如下:

unserialize(<serialized_string>);

更新:

在使用php-serialize库时,我正在尝试以下代码:

const PhpSerialize = require("php-serialize");
const serialised_str = 'a:2:{s:3:"$or";a:1:{i:0;a:1:{s:4:"$and";a:1:{i:0;a:1:{s:20:"attributes.FIRSTNAME";C:18:"MongoDB\BSON\Regex":49:{a:2:{s:7:"pattern";s:2:"^a";s:5:"flags";s:1:"i";}}}}}}s:4:"$and";a:1:{i:0;a:1:{s:3:"$or";a:2:{i:0;a:1:{s:8:"batch_id";a:1:{s:7:"$exists";b:1;}}i:1;a:1:{s:2:"sc";a:1:{s:3:"$ne";i:-2;}}}}}}';
console.log(PhpSerialize.unserialize(serialised_str));

并且得到了这个错误:

Error: Expected '"' at index 106 while unserializing payload

如果我尝试反序列化没有类的字符串,它可以正常工作。但如果该字符串有一些 PHP 类,它就会停止工作。

请有人帮助我解决这个问题。提前感谢您的帮助。


@Triby 我已经尝试使用 BSON 包了,但是它没有起作用。它给了我一个错误信息:Error: bson size must be >= 5, is 0。 - Akshit Jindal
所以,你的 BSON 有错误,你做了什么来调试和查看它的内容? - Triby
实际上是正确的。在 PHP 中反序列化时,它显示了预期的结果,但在 Node 中没有。 - Akshit Jindal
但在尝试反序列化之前,您需要了解在节点中获取的内容。 - Triby
你有一个序列化的类 C:18:\"MongoDB\\BSON\\Regex\",它不受 unserialize 函数的支持。也许如果在 PHP 中加载了该类,则可以做到,但是不确定它是否适用于 node.js。 - Triby
显示剩余3条评论
1个回答

0
"a:2:{s:3:\"$or\";a:1:{i:0;a:1:{s:4:\"$and\";a:1:{i:0;a:1:{s:20:\"attributes.FIRSTNAME\";C:18:\"MongoDB\\BSON\\Regex\":49:{a:2:{s:7:\"pattern\";s:2:\"^a\";s:5:\"flags\";s:1:\"i\";}}}}}}s:4:\"$and\";a:1:{i:0;a:1:{s:3:\"$or\";a:2:{i:0;a:1:{s:8:\"batch_id\";a:1:{s:7:\"$exists\";b:1;}}i:1;a:1:{s:2:\"sc\";a:1:{s:3:\"$ne\";i:-2;}}}}}}"

这不是BSON。 BSON是二进制的,你无法像文本一样阅读它。上面的内容看起来像是PHP序列化的PHP数据结构。

听起来你应该澄清你正在处理的不同部分是什么(首先是为了自己,因为你似乎混淆了各种序列化格式),然后修改你的问题。

有时候当人们说“BSON文档”这个短语时,他们实际上并不是指BSON - 他们只是在引用一个键值对映射,可能具有某些属性,比如键都是字符串。


所以你的问题是:我以格式A发送一些数据到一个应用程序,该应用程序将其反序列化为本地数据结构D,可能以未指定的方式进行转换,然后最终将其发送到一个库,该库抱怨格式C存在问题。你需要缩小问题范围。中间过程中应用程序正在处理的本地表示D是否正确? - D. SM
我已经编辑了这个问题。这是一个 PHP 序列化字符串,我正在 JavaScript 中对其进行反序列化,但是出现了错误。 - Akshit Jindal
我使用了php-serialize。由于字符串中的类,它无法反序列化。 Locutus也是一个库,将其他语言的标准库转换为JavaScript。 - Akshit Jindal
使用php-serialize创建一个最小可重现的示例,发布该示例、输入和运行时获得的结果。 - D. SM
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接