有没有办法限制 PHP 的 unserialize() 只解析数组?
出于安全原因。假设在未序列化的对象中有一个邪恶的 __unserialize() 魔术方法,我不想调用!
有没有办法限制 PHP 的 unserialize() 只解析数组?出于安全原因。假设在未序列化的对象中有一个邪恶的 __unserialize() 魔术方法,我不想调用!
据我所知,没有。
可以使用类似的函数找出序列化值的类型this one https://www.php.net/manual/en/function.unserialize.php#96938,但这也不会帮助你,因为数组的任何成员都可能再次成为一个对象,其反序列化将触发__wakeup()
call.
您必须扩展该函数,以便它遍历序列化字符串的所有成员,而无需实际序列化它。当然可能,但可能会很混乱且缓慢。
我想到的唯一的其他方法是unserialize()
在未定义类的环境中调用。这将导致该类的对象损坏__PHP_Incomplete_Class
然后你就可以解析出来。然而,在正常的脚本环境中,这对您没有帮助。
也就是说,永远不要忘记序列化对象永远不会包含任何代码。类定义必须通过其他方式出现在您的代码库中。
鉴于此,我不确定在什么情况下这首先会成为安全问题。如果您的代码库中有恶意代码,那么就有很多机会执行它而无需反序列化任何内容,不是吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)