Php 如何确定字符串是序列化对象/数组还是字符串?

Php 如何确定字符串是序列化对象/数组还是字符串?,php,serialization,Php,Serialization,是否有可靠的方法来确定字符串变量是字符串还是序列化对象/数组的字符串表示形式?您可以调用函数:如果字符串无法取消序列化,它将返回false。您可以通过查看格式来判断。当你序列化一个数组时,你会得到一个类似于a:1:{i:0;s:3:“foo”}的字符串,如果你序列化一个对象,你会得到:o:7:“myclass”:1:{s:3:“foo”;s:3:“bar”} 因此,如果您想测试基本规则,可以执行以下两个正则表达式: ^a:\d+:{.*?}$ 及 分别用于数组和对象 注意,这只是检查泛型表单。

是否有可靠的方法来确定字符串变量是字符串还是序列化对象/数组的字符串表示形式?

您可以调用函数:如果字符串无法取消序列化,它将返回
false

您可以通过查看格式来判断。当你序列化一个数组时,你会得到一个类似于
a:1:{i:0;s:3:“foo”}
的字符串,如果你序列化一个对象,你会得到:
o:7:“myclass”:1:{s:3:“foo”;s:3:“bar”}

因此,如果您想测试基本规则,可以执行以下两个正则表达式:

^a:\d+:{.*?}$

分别用于数组和对象


注意,这只是检查泛型表单。要判断它是否是有效的序列化字符串,您需要通过
unserialize()
运行它,并测试返回的
是数组($result)
是对象($result)

可能重复@andre:是的,很严重。有时您可能不想取消序列化,原因有几个(例如,如果没有定义类名,或者类名很昂贵,等等)。在存储序列化字符串之前,它可能只是一个健全的检查。原因有很多。如果你知道一个比regex更好的方法而不调用
unserialize
,我洗耳恭听……如果你的字符串太大,unserialize可能是一个繁重的操作,你不认为regex匹配也会很昂贵吗?无论如何,谢谢你解释原因。:-)@andre:它不会像取消序列化所需的双重内存分配那样昂贵(因为您需要将字符串和新对象/数组都保留在内存中)。当然,走起来会有点慢,但是那些正则表达式相当有效,所以我不会太担心它们(实际上没有必要回溯)。。。但是很公平……玩得开心:
PHP警告:Class\uuuuphp\u complete\u Class在第5行object(\uuuuphp\u complete\u Class)上的/root/hacked.PHP中没有unserializer(\uuuuphp\u complete\u Class\u Name){[“\uuuuuu PHP\u complete\u Class\u Name”]=>string(8)“Poreikis”}/code>在前面使用一个符号和来抑制错误消息(即@unserialize)@Andrew
@
不叫符号。符号是
&
如果字符串是
b:0<代码> unSerials将返回<代码> false 。但它是一个有效的序列化值。重要的是:永远不要序列化原始用户数据,因为它可以用作攻击向量。
^o:\d+:"[a-z0-9_]+":\d+:{.*?}$