上个周末,我老雇主的服务器已根植,显然服务器提供商对服务器进行了更改,这会影响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。
答案 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
是提供商所做的更改,那么您还应该打败您的提供商。