POST 值可以成为 PHP 中某物的实例吗?

Can a POST value ever be an instanceof something in PHP?

提问人:tim 提问时间:9/11/2022 更新时间:9/11/2022 访问量:60

问:

我遇到过带有检查的PHP代码,该检查测试POST值是否为a类:instanceof

if ($_POST['something'] instanceof SomeClass) {
    // do something
}

这对我来说似乎很奇怪,因为我不认为检查可能是真的。POST 值毕竟是一个字符串,而字符串不是类的实例。

我尝试传递实例的序列化版本(),但这不起作用(这是有道理的,因为它仍然是一个字符串,而不是一个对象)。O:9:"SomeClass":0:{}

我认为这个检查永远不可能是真的,这是对的吗?还是我在这里遗漏了什么?

PHP 对象 比较 instanceof

评论

4赞 ADyson 9/11/2022
是的,这对我来说是无稽之谈
3赞 deceze 9/11/2022
让我们希望任何地方都没有对数组进行预处理......‽$_POST
0赞 tim 9/11/2022
@deceze据我所知(我正在对代码进行安全审计,所以那本来是......有趣的)。

答:

0赞 user1986815 9/11/2022 #1

我认为这不是一个简单的问题。我认为理论上是“是的”。

由于 $_POST 是一个变量数组,并且对数组的元素没有限制,例如,您可以创建一个对象数组。

$array[] = new stdClass;
$array[0]->variable = value;
etc ...

您会看到代码作者正在检查 $_POST['something'](它是数组的一个元素,并且很容易成为对象)是否是类的实例。

现在我还没有测试过它,但从理论上讲,人们可以将一个类的对象放在一个数组中,并通过 $_POST 很好地编码来发送它。

评论

2赞 ADyson 9/11/2022
是的,但 php 会将其解码为数组,而不是类
3赞 ADyson 9/11/2022
唯一可能使 OP 的代码成为必要的是,如果接收请求的某些代码在脚本中的这一点之前直接干扰了 $_POST 数组
0赞 9/11/2022
@ADyson只是为了逗你一点:或者$object = (object) $array;$object = json_decode(json_encode($array), FALSE); ;-)
1赞 tim 9/11/2022
感谢您的回答!但就这个问题而言,默认变量是由 PHP 填充的;它不会通过自定义PHP代码在服务器上以任何方式进行操作。当然,如果我们假设操纵,则通过检查是微不足道的(例如)。$_POST$_POST$_POST['something'] = unserialize($_POST['something'])
0赞 ADyson 9/11/2022
@MaxMuster是的,但我们谈论的是将 HTTP 请求中的数据自动解码为 _POST 美元,这是 php 默认执行的,而不是一些自定义代码。