为什么 PHP 文档指示即使使用 allowed_classes=false,也不要将不受信任的用户输入传递给 unserialize()?

Why the PHP documentation indicates to not pass untrusted user input to unserialize() even with allowed_classes=false?

提问人:user2543740 提问时间:9/4/2023 更新时间:9/4/2023 访问量:35

问:

我了解使用不受信任的用户数据的风险,例如没有或有。但是,为什么即使?也不应该提供不受信任的用户数据?unserialize()$optionsallowed_classes=trueallowed_classes=false

如果不应该实例化任何对象,那么应该没有机会利用 API,至少从这个角度来看是这样。allowed_classes=false

PHP 输入 序列化 文档

评论

1赞 Markus Zeller 9/4/2023
正如文档所说,它可能会触发自动加载。结果可能已过滤掉任何类。但那是不一样的。序列化也不是一个好主意,因为数据可以很容易地作。这就是为什么 json 或 hmac 是个好主意。
0赞 user2543740 9/5/2023
所以PHP太糟糕了,即使你有一个参数来禁用all_classes那么,一些对象仍然可以“自动加载”?哇,你能(@MarkusZeller)详细说明“它可能会触发自动加载。结果可能已经过滤掉了任何类“——你是说它会加载它们然后过滤它们吗?使用 HMAC 似乎不是最好的设计选择,因为密钥可能会泄漏或被猜到,或者谁知道服务器可以“签署”任何东西,如果愚蠢的编程,等等。
1赞 Markus Zeller 9/5/2023
我不知道,但这引起了我的兴趣,并将做一个实验......但这就是我从文档中读到的。
1赞 Markus Zeller 9/5/2023
不会触发自动加载器,但它会创建一些别名 emtpy 类。 pastebin.com/Lfq88rE5 如果链接了多个自动加载器,这可能是一个问题。allowed_classes => false
1赞 Sammitch 9/5/2023
因为为了工作,它必须超出 PHP 核心中的某些护栏,并且一直是许多高分 CVE 的来源。根本没有“足够安全”的设置,取消序列化您自己没有序列化并且始终 100% 控制的任何内容只是一个糟糕的主意。如果你只是想要实际的推理,你最好的办法是检查邮件列表存档。unserialize()

答: 暂无答案