不要直接访问超全局变量$ _REQUEST数组。Netbeans 8.0 PHP

12

在阅读了其他几个问题之后,我有一个问题。

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

在Netbeans 7.4的PHP上“不要直接访问超全局变量$_SERVER数组”

为什么filter_input()函数是不完整的?

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

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

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

建议非常简单。

使用一些过滤函数代替(例如filter_input()、带有is_*()函数的条件等)。

于是我开始研究fliter_input(),但它尚未实现对$_REQUEST的支持。这似乎有点死路一条。

然后我读到了一个非常有用的东西(@bobince):“在你的脚本开始时,当你在过滤时,你不知道你的输入最终会停在哪里,所以你不知道如何逃避它。

这让我想起来,我知道我的输入最终会停在哪里,以及它将用于什么。因此,我想问大家,我即将采取的方法是否基本上安全

我正在设计一个类REST的API,使用$_SERVER['REQUEST_METHOD'];来确定需要返回的资源。我还使用$_REQUEST['resource'];,应该包含在经过.htaccess重写/api/之后URI中的所有内容。

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

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

我意识到,这可能看起来像是对一个“警告”的过度关注,但是在我的经验中,仅修复“错误”可以给你“可工作的代码”,但是修复“警告”可以帮助你理解“代码为什么运行”。


2
避免使用 $_REQUEST 的一般想法是,你应该知道你的数据来自哪里,是 GET 还是 POST。我认为这就是为什么在 filter_input 中没有实现它的原因。在你的情况下不是这样吗?为什么?(无论如何,+1 是给你之前的研究和周到的问题!) - Pekka
@Pekka웃 谢谢。作为请求的入口点,php 可以确定请求方法,但是由于我使用 .htaccess 添加数据,所以我的请求中通常会有一些混合数据(一些 GET 和可能其他一些)。因此,在我的情况下,我希望在 API 代码中使用 $_REQUEST 来保持一致性。显然,如果这不是最好的方法,我将采用利用 $_GET$_POST 的方法,因为我知道数据应该在哪里。 - samazi
1个回答

3
所以我开始研究filter_input(),但它尚未为$_REQUEST实现。这似乎有点走投无路。
我想说这不是一个死路,而是有意的。 filter_input()要求您清楚地指定输入类型。 $_REQUEST不清楚它包含来自各种来源的输入,允许一个来源覆盖另一个来源。
此外,这也不是警告想要准确告诉你的内容。像$_GET这样的超全局变量与filter_input(INPUT_GET, ...)等超全局函数交换显示相同的设计缺陷。但Netbeans无法像这样轻松地警告您。
摆脱超级全局变量已经是一个好主意。
相反,在低层次的地方向应用程序注入输入数据,例如引导请求信息,不要在代码的其余部分中使用任何超级全局变量或filter_input函数。
这将使您能够轻松模拟任何请求方法,甚至没有实际请求。

引导是应用程序中的一个阶段,其中它被设置(启动)。然后它被启动。它不是一个框架,而是描述应用程序中的某个阶段(例如从配置文件获取配置值,设置路径,整个应用程序上下文,例如从服务器API获取数据,如那些所述的超级全局变量)。 - hakre
PHP方面,什么时候应该在应用程序或请求生命周期中完成此操作?当获取超级全局变量时,难道不会遇到相同的问题吗?也就是说,某个部分的应用程序在某个时间点必须访问超级全局变量吧? - samazi
1
@CihadTurhan:你应该减少使用超全局变量。你仍然会有(最好只有一个地方)$_POST$_GET被注入,很可能是在引导程序中。只要小心,99.99%的代码不依赖于超全局变量。0.01%是允许的。想象一下超全局变量真的很昂贵,你需要节省成本。 - hakre
@hakre 我明白你的意思。永远不要完全信任超级全局变量,并尽可能少地使用它 :) 谢谢。 - Cihad Turhan
你可以相信它们,但是你应该意识到那些是全局变量。这些往往会耦合代码,而你通常不希望它们被耦合。 - hakre
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接