【问题标题】:Deserializing a PHP serialized string in node js在节点 js 中反序列化 PHP 序列化字符串
【发布时间】:2020-08-04 10:19:42
【问题描述】:

我有一个 PHP 序列化字符串,我在 Node js 中使用 php-serialize 或 '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 类,它就会停止工作。

请有人帮我解决这个问题。提前致谢。

【问题讨论】:

  • 你可以使用BSON Package
  • @Triby 我尝试过使用 BSON 包。它没有用。它给了我错误 Error: bson size must be >= 5, is 0.
  • 那么,您的 BSON 有错误,您要如何调试和查看其内容?
  • 其实是对的。在 PHP 中反序列化时,它显示了预期的结果,但不在节​​点中
  • 但是在尝试反序列化之前你需要知道你在节点中得到了什么。

标签: php node.js regex mongodb deserialization


【解决方案1】:
"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 的意思——他们只是指键到值的映射,可能具有某些属性,例如键都是字符串。

【讨论】:

  • 你是对的。这是 PHP 序列化字符串。我将它与 BSON 定义混淆了。所以会发生什么是在 PHP 中序列化并发送到我需要反序列化的节点服务器。我在节点中为此使用了各种库,但没有得到答案。问题中说明了我遇到的错误。
  • 所以你的问题是:我将格式 A 的一些数据发送到应用程序,该应用程序将其反序列化为本机数据结构 D,可能以未指定的方式对其进行转换,然后最终将其发送到抱怨的库关于格式 C 的问题。您需要缩小问题所在。您的应用程序在此过程中使用的本机表示 D 是否正确?
  • 我已经编辑了这个问题。这是 PHP 序列化字符串,我在 javascript 中反序列化,我收到错误
  • 有npmjs.com/package/php-serialize。什么是“locutus”?
  • 我用过php-serialize。由于字符串中的类,它无法对其进行反序列化。 Locutus 也是一个将其他语言的标准库转换为 JavaScript 的库。
猜你喜欢
  • 2015-11-26
  • 1970-01-01
  • 2012-06-19
  • 2014-07-14
  • 2012-05-10
  • 2018-10-22
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多