在阅读了其他几个问题后,我们会问这个问题.
在Netbeans 7.4 for PHP上"不要直接访问Superglobal $ _SERVER数组"
我已经加载了最新版本Netbeans 8.0,我看到了一个警告
不要直接访问Superglobal $ _REQUEST数组.
太棒了,我很高兴能在我做一些可以改进的事情时出现,所以我看看hints.
这个建议很简单.
请改用一些过滤函数(例如filter_input(),带有_*()函数的条件等).
所以我开始研究fliter_input()它尚未实现$_REQUEST.这似乎有点死路一条.
然后我读了一些非常有帮助的东西(@bobince)" 在你的脚本开始过滤时,你不知道你的输入最终会在哪里,所以你不知道如何逃避它. "
它提醒我,我确切地知道我的输入最终会在哪里,以及它将用于什么.所以,我想问问每个人我将采取的方法是否基本上是safe.
我正在设计一个REST- ish API,我$_SERVER['REQUEST_METHOD'];用来确定需要返回的资源.我也使用$_REQUEST['resource'];它应该包含的一切URI后/api/跟随.htaccess rewrite.
我对我的方法的问题是:
$_SERVER['REQUEST_METHOD'];是否符合要求GET PUT POST DELETE(无论如何我都需要做),是否真的存在不填写输入的问题?$_REQUEST['resource'];通过使用来访问filter_input (INPUT_GET, 'resource');吗?当这只用于确定资源,以及无法确定资源的地方(比如有人试图添加恶意代码)时,我们根本找不到资源并返回404 Not Found状态.我意识到,对于仅被视为警告的内容,这看起来似乎很多,但是根据我的经验,只修复错误将为您提供工作代码,但修复警告将帮助您理解代码的工作原理.
所以我开始研究
fliter_input()它尚未实现$_REQUEST。这似乎有点死胡同。
我想说这不是死胡同,而是故意的。filter_input()要求您明确指定输入类型。$_REQUEST不清楚,它包含来自各种来源的输入,允许一个来源覆盖另一个来源。
除此之外,这也不是警告想要告诉您的内容。将超全局 like$_GET与同样超全局的函数 like交换filter_input(INPUT_GET, ...)显示出相同的设计缺陷。但 Netbeans 无法如此轻松地警告您。
摆脱超全局变量已经是一个好主意了。
相反,将输入数据注入到应用程序的低级别位置,例如引导请求信息,并且不要使用任何超全局变量或代码filter_input其余部分中的函数。
这将允许您轻松模拟任何请求方法,甚至无需实际请求。