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

sil*_*sil 2 php serialization get

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

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

更新:

我看到文档说:"你正在序列化的数组/对象中的循环引用也将被存储.任何其他引用都将丢失."

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

Pek*_*ica 6

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

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

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

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

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


Pau*_*xon 6

绝对的,积极的,没有.

你不应该盲目地相信客户方面的任何事情,但是有一种方法你可以给自己更多的信心.

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

另一种方法是反序列化对象,但将其视为"污染",然后将未序列化的数据复制并重新验证为"干净"的对象.