PHP /反序列化 - 反序列化$ _GET值是否安全?

时间:2011-01-29 20:02:06

标签: php serialization get

我通过$ _GET []在我的网页周围传递urlencode()d serialize()d数组。

从$ _GET反序列化()一个值是否安全?有时会向用户显示反序列化的数组。用户是否可以在我的代码中公开/引用变量或函数等?换句话说,在反序列化值时,PHP会将其视为数据还是代码?

更新

我看到文档说: “您正在序列化的数组/对象内的循环引用也将被存储。任何其他引用都将丢失。”

这意味着我安全吗? : - )

4 个答案:

答案 0 :(得分:6)

此方法与任何其他类型的传入GET或POST数据一样“安全” - 在使用之前,始终需要清理数据!但是,对用户数据进行反序列化还存在其他问题。

在反序列化对象时,PHP将查看该类是否具有__wakeup magic method。如果存在,该方法将被执行。

现在这本身并不是一个巨大的安全漏洞,因为类定义永远不会在序列化数据中传输。任何恶意代码都必须已存在于系统中。但是,可以想象这可能是一个问题(例如,可以安装第三方代码的插件系统),我会非常谨慎。

另外,从理论上讲,这允许攻击者在脚本中创建任何类的对象。虽然不是一个安全问题,但这肯定不是一个好习惯。

JSON编码是一种更安全的方式,因为它只能包含“哑”数据。

答案 1 :(得分:6)

绝对,积极,不。

你不应盲目相信客户方面的任何事情,但有一种方法可以让你自己更有信心。

我假设如果你有来自客户端的PHP序列化数据,那个客户端在某个时候从服务器获得了这些数据?如果是这种情况,并且客户端不修改数据,您可以包含哈希以及数据以验证它是否未被篡改。

另一种选择是反序列化对象,但将其视为“污染”,然后将未序列化的数据复制并重新验证为“干净”的对象。

答案 2 :(得分:0)

仅序列化对象/数组/变量的数据部分,实际的可执行代码未被序列化 - 没有必要这样做 - 序列化有助于在两个不同的世界之间传输数据 - 执行的代码可以相同或不同 - 对于数据而言无关紧要。

尽管可能存在可能的黑客攻击 - 但仅基于数据 - 类和类型以及值可能会有所不同 - 代码是如何在反序列化期间处理错误的。

答案 3 :(得分:-1)

是的,它的安全。您要问的是序列化$ _GET数组的值是否安全。是的,这是安全的。在数组序列化期间没有执行任何操作。由于$ _GET数组不包含任何对象,只有查询字符串中的参数,因此在序列化/反序列化过程中不会造成任何伤害。

您提到了您在有关循环引用的文档中看到的内容。不要担心,它不适用于你的情况,因为$ _GET数组中没有对象。

就使用$ _GET数组中的实际数据而言,这是一个不同的问题,答案是否定的,如果不先应用某种类型的过滤器或验证,使用$ _GET数组中的数据是不安全的