";不要直接访问Superglobal$_REQUEST数组";Netbeans 8.0 PHP


"Do not Access Superglobal $_REQUEST Array Directly." Netbeans 8.0 PHP

这个问题是在阅读了其他一些问题之后提出的。

不要直接访问超全局$_GET数组

Netbeans 7.4 for PHP 上的"请勿直接访问Superglobal$_SERVER数组"

为什么filter_put()不完整?

我已经加载了最新版本的Netbeans 8.0,我看到了一个警告

不要直接访问Superglobal$_REQUEST数组。

太好了,当我在做一些可以改进的事情时,我很高兴被展示出来,所以我看了hints

这个建议很简单。

请使用一些筛选函数(例如filter_put()、conditions具有is_*()函数等)

因此,我开始研究fliter_input(),但它尚未在$_REQUEST中实现。这似乎是一条死胡同。

然后我从(@boince)"在脚本开始时,当你进行筛选时,你不知道你的输入将在哪里结束,所以你不知道如何逃离它。"

它提醒我,我确切地知道我的输入将在哪里结束,以及它将被用于什么。所以,我想问大家,我要采取的方法是否本质上是safe

我正在设计一个REST-ishAPI,并使用$_SERVER['REQUEST_METHOD'];来确定需要返回的资源。我也在使用$_REQUEST['resource'];,它应该包含URI/api/之后.htaccess rewrite之后的所有内容。

我对我的方法有以下问题:

  1. 如果我总是验证$_SERVER['REQUEST_METHOD'];在所需的GET PUT POST DELETE内(无论如何我都需要这样做),那么不过滤输入真的有问题吗
  2. 我应该使用filter_input (INPUT_GET, 'resource');访问$_REQUEST['resource'];吗?当这只用于确定资源,而无法确定资源时(比如有人试图添加恶意代码),我们将无法找到资源并返回404 Not Found状态
  3. 我还需要考虑其他因素吗?在我的理解中,我是否遗漏了任何关键因素

我意识到,这似乎是对仅被视为警告的很多关注。然而,根据我的经验,仅修复错误将为您提供工作代码,但修复警告将有助于您理解代码工作的原因。

因此,我开始研究fliter_input(),但它尚未在$_REQUEST中实现。这似乎是一条死胡同。

我想说这不是死胡同,而是故意的。filter_input()要求您明确指定输入类型。$_REQUEST对此并不清楚,它包含来自各种来源的输入,允许一个来源覆盖另一个来源。

除此之外,这也不是警告想要告诉你的。将类似$_GET的超全局函数与类似filter_input(INPUT_GET, ...)的同等超全局函数进行交换显示出相同的设计缺陷。但是Netbeans不能那么容易地警告你。

摆脱超全局已经是个好主意了。

相反,在底层将输入数据注入到应用程序中,例如引导请求信息,并且在代码的其余部分中不使用任何超全局变量或filter_input函数。

这将允许您轻松地模拟任何请求方法,甚至不需要实际的请求。