【问题标题】:"Do not Access Superglobal $_REQUEST Array Directly." Netbeans 8.0 PHP“不要直接访问超全局 $_REQUEST 数组。” Netbeans 8.0 PHP
【发布时间】:2014-04-28 01:12:35
【问题描述】:

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

Do not access superglobal $_GET array directly

“Do not Access Superglobal $_SERVER Array Directly” on Netbeans 7.4 for PHP

Why is filter_input() incomplete?

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

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

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

这个建议很简单。

改用一些过滤函数(例如 filter_input()、条件 使用 is_*() 函数等)。

所以我开始研究fliter_input(),但它还没有为$_REQUEST 实现。这似乎有点死胡同。

然后我从 (@bobince) 中读到了一些很有帮助的内容“在您的脚本开始过滤时,您不知道您的输入将在哪里结束,所以您不知道”不知道如何逃脱它。"

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

我正在设计一个 REST-ish API,我正在使用 $_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. 是否还有其他需要考虑的因素以及我是否遗漏了任何对我的理解至关重要的内容?

我知道,这可能看起来很令人担忧,因为它只是被视为一个警告,但是,根据我的经验,仅修复 错误 会给你工作代码,但修复警告将帮助您了解代码工作的原因

【问题讨论】:

  • 避免$_REQUEST 时的一般想法是您应该知道您的数据来自哪里,GETPOST。我认为这就是为什么它没有在filter_input 中实现。你的情况不是这样吗?为什么? (但无论哪种方式,对于先前的研究和深思熟虑的问题 +1!)
  • @Pekka웃 谢谢。 phprequest 的入口点,它可以确定请求方法,但是我总是倾向于将数据(一些GET 可能还有其他)与请求混合在一起,因为我追加了使用.htaccess 的数据,所以在我的情况下,我希望使用$_REQUEST 来保持API 代码的一致性。显然,如果这不是最好的方法,我将采用使用$_GET$_POST 的方法,因为我知道数据应该在哪里。

标签: php netbeans


【解决方案1】:

所以我开始研究fliter_input(),但它还没有为$_REQUEST 实现。这似乎有点死胡同。

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

除此之外,这也不是警告想要告诉您的内容。将$_GET 之类的超全局函数与filter_input(INPUT_GET, ...) 之类的同样超全局函数交换显示了相同的设计缺陷。但 Netbeans 无法轻易警告您。

摆脱超全局变量已经是一个好主意。

相反,将输入数据注入到您的应用程序的低级位置,例如引导请求信息,不要在其余代码中使用任何超全局变量或 filter_input 函数。

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

【讨论】:

  • 是的,这确实是有道理的,当你这样看时它会是故意的。我不是 100% 清楚您所说的 bootstrapping 请求是什么意思。这是来自框架还是我可以自己构建的东西?你能稍微扩展一下吗?我绝对需要能够模拟和处理超过GETPOST,所以这个想法对我很有吸引力。
  • 引导是应用程序中设置(引导)的一个阶段。然后它被点燃。它不是一个框架,而是描述了应用程序中的某个阶段(例如,从配置文件中获取配置值、设置路径、整个应用程序上下文,例如从服务器 api 中获取数据,例如那些超全局变量。
  • 太棒了,就PHP 而言,在应用程序或请求生命周期中应该这样做,并且在获取超全局变量时,您不会遇到同样的问题吗?即,应用程序的某些部分是否必须在某个时间点访问 supergloabls?
  • @hakre 我在这里也很困惑。那么,如果不使用$_POST$_GET 之类的超全局变量,如何从db 中检索数据并返回给客户端呢?
  • @CihadTurhan:你应该减少超全局变量的使用。您仍然会有(最多一个地方)注入$_POST$_GET 的地方,很可能是在引导过程中。请注意,您 99,99% 的代码不依赖于超全局变量。允许 0,01%。试想一下,superglobals 真的很贵,你需要节省成本。
猜你喜欢
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多