【发布时间】: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 之后的所有内容。
我对我的方法的疑问是:
- 如果我始终验证
$_SERVER['REQUEST_METHOD'];是否在所需的GETPUTPOSTDELETE范围内(无论如何我都需要这样做),那么不过滤输入真的有问题吗? - 我应该使用
filter_input (INPUT_GET, 'resource');访问$_REQUEST['resource'];吗?如果这仅用于确定资源,并且无法确定资源(例如有人试图添加恶意代码),我们将根本找不到资源并返回404 Not Found状态。 - 是否还有其他需要考虑的因素以及我是否遗漏了任何对我的理解至关重要的内容?
我知道,这可能看起来很令人担忧,因为它只是被视为一个警告,但是,根据我的经验,仅修复 错误 会给你工作代码,但修复警告将帮助您了解代码工作的原因。
【问题讨论】:
-
避免
$_REQUEST时的一般想法是您应该知道您的数据来自哪里,GET或POST。我认为这就是为什么它没有在filter_input中实现。你的情况不是这样吗?为什么? (但无论哪种方式,对于先前的研究和深思熟虑的问题 +1!) -
@Pekka웃 谢谢。
php是request的入口点,它可以确定请求方法,但是我总是倾向于将数据(一些GET可能还有其他)与请求混合在一起,因为我追加了使用.htaccess的数据,所以在我的情况下,我希望使用$_REQUEST来保持API代码的一致性。显然,如果这不是最好的方法,我将采用使用$_GET和$_POST的方法,因为我知道数据应该在哪里。