当序列化其他不相关的对象时,为什么对象会变成字符串?

时间:2010-03-03 21:42:33

标签: php object serialization

上个周末,我老雇主的服务器已根植,显然服务器提供商对服务器进行了更改,这会影响PHP代码。

出现的问题与序列化对象有关。被序列化的对象和其他未被序列化的对象正被转换为字符串,从而破坏了代码。此代码在服务器被黑客攻击之前有效。

以下是发生的事情:

$plate = new Plate();
$plate2 = clone $plate;
gettype($plate); // Prints "object"
gettype($plate2); // Prints "object"

$_SESSION['plate'] = serialize($plate);

gettype($plate); // Prints "string"
gettype($plate2); // Prints "string"


$plate = new Plate();
$plate2 = new Plate();
gettype($plate); // Prints "object"
gettype($plate2); // Prints "object"

$_SESSION['plate'] = serialize($plate);

gettype($plate); // Prints "string"
gettype($plate2); // Prints "string"

正如您所看到的那样,即使那些未被序列化的对象也被转换为字符串。任何见解?

编辑:他们正在运行带有寄存器全局变量的PHP 5.2.12。

1 个答案:

答案 0 :(得分:4)

更新:我可以在PHP 5.3.1上重现一半您的测试用例,但前提是我将register_globals设置为 On

session_start(); // obviously

class Plate  // to have something on my plate
 {

    var $Member1;
    var $Member2;

 }

$plate = new Plate();
$plate2 = clone $plate;
echo gettype($plate); // Prints "object"
echo gettype($plate2); // Prints "object"

$_SESSION['plate'] = serialize($plate);

echo gettype($plate); // Prints "string"
echo gettype($plate2); // Prints "object", unlike in your example

$plate = new Plate();
$plate2 = new Plate();
echo gettype($plate); // Prints "object"
echo gettype($plate2); // Prints "object"
$_SESSION['plate'] = serialize($plate);

echo gettype($plate); // Prints "string"
echo gettype($plate2); // Prints "object", unlike in your example

$plate2对我来说始终没有受到影响。也许你在某个地方有一个有趣的$plate2 = &something参考?这是实际代码吗?我的代码段在您的系统上做了什么?

我认为有缺陷的部分与$ _SESSION错误(或副作用)有关,它将$ _SESSION中的单位化变量视为全局变量。见this SO question。将会话变量的名称更改为其他名称将解决此问题。

$_SESSION['session_plate'] = serialize($plate);  // $plate will remain unharmed

如果将register_globals设置为On是提供商所做的更改,那么您还应该打败您的提供商。