【问题标题】:Limiting unserialize() to return arrays?限制反序列化()返回数组?
【发布时间】:2010-10-06 16:26:15
【问题描述】:

有没有办法限制 PHP 的 unserialize() 只解析数组? 出于安全原因。假设我不想调用的未序列化对象中有一个邪恶的 __unserialize() 魔术方法!

【问题讨论】:

    标签: php security serialization


    【解决方案1】:

    有没有办法限制 PHP 的 unserialize() 只解析数组?出于安全原因。假设我不想调用的未序列化对象中有一个邪恶的 __unserialize() 魔术方法!

    我不知道,没有。​​

    可以使用this one 之类的函数找出序列化值的类型,但这也无济于事,因为数组的任何成员都可能再次是一个对象,其反序列化将触发@987654322 @ 称呼。

    您必须扩展该函数,以便它遍历序列化字符串的所有成员,而无需实际序列化它。当然可能,但可能会很笨拙且缓慢。

    想到的唯一其他方法是在没有定义类的环境中调用unserialize()。这将导致__PHP_Incomplete_Class 类的对象损坏,然后您可以解析出该对象。但是,在正常的脚本环境中,这对您没有帮助。

    也就是说,永远不要忘记序列化对象永远不会包含任何代码。类定义必须通过其他方式出现在您的代码库中。

    有鉴于此,我不确定在什么情况下这首先可能是一个安全问题。如果您的代码库中有恶意代码,那么将有很多机会执行它而无需反序列化任何内容,不是吗?

    【讨论】:

    • 危险类将有一个 __wakeup() 方法来评估对象的一个​​属性和...
    • 我们有一个庞大的类库和一个自动加载器,所以很难确定应用程序启动时不会发生任何坏事!尽管系统只接受完全加密的字符串,其密钥仅对应用程序本身可见,但我仍然不满意我将确保层放在哪里!
    • @CgAlive 如果我设法在你的项目中加入了一个邪恶的类定义,我为什么要等待一些反序列化事件来执行邪恶的代码?
    • 你不能把这个类放到我们的库中(希望如此!),也不会有任何类想要有这样的恶意代码。问题不在于邪恶,而在于任何意想不到的事情。假设一个对象打开一个套接字来与外界连接并提供一些交互功能,很明显它必须在 __wakeup() 上重新打开套接字并从它的一个属性中读取地址,这就是事情开始变得混乱的原因!所以一个 unserialize() 可以给我们很多可能的漏洞,我们可以接受 DOS 攻击和许多其他事情......
    【解决方案2】:

    有几种方法可以解决这个问题:

    1. 对序列化字符串使用正则表达式:

    Piwik 通过以下检查修补了 unserialize vulnerability

    if (preg_match('/^a:[0-9]+:{/', $str) 
    && !preg_match('/(^|;|{|})O:\+?[0-9]+:"/', $str)
    
    1. 签署已签名的字符串。如果您将序列化字符串的 sha1 哈希 + 秘密添加到 Cookie/POST Var。您可以确定序列化的字符串没有被操纵。

    2. 编写您自己的反序列化函数。如果您只对数组感兴趣,则不需要反序列化。自己写一些东西或使用 JSON 等公认的标准。

    请忽略此处未发现安全问题的所有 cmets。 unserialize() 漏洞存在于非常高比例的 PHP5 应用程序中,大多数书籍和教程甚至都没有谈论它们。

    【讨论】:

    • 哇,谢谢伙计!我开始认为我正在变成一个偏执的程序员!好吧,我不能使用 JSON 或其他任何东西,因为我需要 unserialize() 的速度。有趣的是,序列化的值永远不应该在客户端/服务器之间传递。它存储在我们的安全数据库中,并且经过加密,还具有哈希和盐以及所有内容。但我不需要信任数据库。我的意思是,如果我们的一个数据库节点被搞砸了,我不想看到我的整个应用程序都失败了。所有层和组件都必须有自己的安全措施!
    • 这个答案详细说明了为什么它是必要的:stackoverflow.com/questions/22433167
    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多