这个问题是在阅读了其他一些问题之后提出的。
不要直接访问超全局$_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
之后的所有内容。
我对我的方法有以下问题:
- 如果我总是验证
$_SERVER['REQUEST_METHOD'];
在所需的GET
PUT
POST
DELETE
内(无论如何我都需要这样做),那么不过滤输入真的有问题吗 - 我应该使用
filter_input (INPUT_GET, 'resource');
访问$_REQUEST['resource'];
吗?当这只用于确定资源,而无法确定资源时(比如有人试图添加恶意代码),我们将无法找到资源并返回404 Not Found
状态 - 我还需要考虑其他因素吗?在我的理解中,我是否遗漏了任何关键因素
我意识到,这似乎是对仅被视为警告的很多关注。然而,根据我的经验,仅修复错误将为您提供工作代码,但修复警告将有助于您理解代码工作的原因。
因此,我开始研究
fliter_input()
,但它尚未在$_REQUEST
中实现。这似乎是一条死胡同。
我想说这不是死胡同,而是故意的。filter_input()
要求您明确指定输入类型。$_REQUEST
对此并不清楚,它包含来自各种来源的输入,允许一个来源覆盖另一个来源。
除此之外,这也不是警告想要告诉你的。将类似$_GET
的超全局函数与类似filter_input(INPUT_GET, ...)
的同等超全局函数进行交换显示出相同的设计缺陷。但是Netbeans不能那么容易地警告你。
摆脱超全局已经是个好主意了。
相反,在底层将输入数据注入到应用程序中,例如引导请求信息,并且在代码的其余部分中不使用任何超全局变量或filter_input
函数。
这将允许您轻松地模拟任何请求方法,甚至不需要实际的请求。