在阅读了其他几个问题之后,我有一个问题。
在Netbeans 7.4的PHP上“不要直接访问超全局变量$_SERVER数组”
我已经加载了最新版本的Netbeans 8.0
并看到了一个警告:
不要直接访问超全局变量$_REQUEST数组。
很好,当我做某些可以改进的事情时,我很高兴被展示出来,所以我看了一下提示。
建议非常简单。
使用一些过滤函数代替(例如filter_input()、带有is_*()函数的条件等)。
于是我开始研究fliter_input()
,但它尚未实现对$_REQUEST
的支持。这似乎有点死路一条。
然后我读到了一个非常有用的东西(@bobince):“在你的脚本开始时,当你在过滤时,你不知道你的输入最终会停在哪里,所以你不知道如何逃避它。”
这让我想起来,我知道我的输入最终会停在哪里,以及它将用于什么。因此,我想问大家,我即将采取的方法是否基本上安全
。
我正在设计一个类REST的API,使用$_SERVER['REQUEST_METHOD'];
来确定需要返回的资源。我还使用$_REQUEST['resource'];
,应该包含在经过.htaccess重写
后/api/
之后URI
中的所有内容。
我对我的方法有以下问题:
- 如果我始终将
$_SERVER['REQUEST_METHOD'];
验证为所需的GET
PUT
POST
DELETE
范围内(无论如何我都需要这样做),不过滤输入是否真的有问题吗? - 我是否应该使用
filter_input (INPUT_GET, 'resource');
访问$_REQUEST['resource'];
?当这只用于确定资源时,并且当无法确定资源(比如有人试图添加恶意代码)时,我们将简单地找不到资源并返回404 Not Found
状态。 - 我是否需要考虑其他事项,我是否在理解上遗漏了任何关键点?
我意识到,这可能看起来像是对一个“警告”的过度关注,但是在我的经验中,仅修复“错误”可以给你“可工作的代码”,但是修复“警告”可以帮助你理解“代码为什么运行”。
$_REQUEST
的一般想法是,你应该知道你的数据来自哪里,是GET
还是POST
。我认为这就是为什么在filter_input
中没有实现它的原因。在你的情况下不是这样吗?为什么?(无论如何,+1 是给你之前的研究和周到的问题!) - Pekkaphp
可以确定请求方法,但是由于我使用.htaccess
添加数据,所以我的请求中通常会有一些混合数据(一些GET
和可能其他一些)。因此,在我的情况下,我希望在API
代码中使用$_REQUEST
来保持一致性。显然,如果这不是最好的方法,我将采用利用$_GET
和$_POST
的方法,因为我知道数据应该在哪里。 - samazi