这个问题是在阅读了其他一些内容之后提出的。
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
并且我看到了一个警告
Do not Access Superglobal $_REQUEST Array Directly.
太好了,当我在做一些可以改进的事情时,我很高兴被展示,所以我查看了提示
。
这个建议很简单。
Use some filtering functions instead (e.g. filter_input(), conditions with is_*() functions, etc.).
所以我开始研究 fliter_input()
但是它还没有为 $_REQUEST
实现。这似乎有点死胡同。
然后我从 (@bobince) 那里读到了一些很有帮助的东西“在你的脚本开始时过滤时,你不知道你的输入将在哪里结束,所以你不知道'不知道如何逃避它。"
它提醒我,我确切地知道我的输入将在哪里结束,以及它的确切用途。所以,我想问大家,我将要采用的方法本质上是否安全
。
我正在设计一个 REST-ish API,我正在使用 $_SERVER['REQUEST_METHOD'];
来确定需要返回的资源。我也在使用 $_REQUEST['resource'];
,它应该包含 /api/
之后 之后的
。URI
上的所有内容。 htaccess 重写
关于我的方法的问题是:
- 如果我总是验证
$_SERVER['REQUEST_METHOD'];
在要求的GET
PUT
POST
DELETE
(无论如何我都需要这样做),不过滤输入真的有问题吗? - 我是否应该使用
filter_input (INPUT_GET, 'resource');
访问$_REQUEST['resource'];
?当这将仅用于确定资源,而无法确定资源时(比如有人试图添加恶意代码),我们将根本找不到资源并返回404 Not Found
状态。 - 我是否需要考虑任何其他注意事项?我是否遗漏了我理解中的任何重要内容?
我意识到,对于仅被视为警告的内容,这似乎很令人担忧,但是,根据我的经验,仅修复错误会给您工作代码,但修复警告将帮助您理解代码工作的原因。
最佳答案
So I start looking into
fliter_input()
however it is not yet implemented for$_REQUEST
. This seems like a little bit of a dead end.
我会说这不是死胡同,而是故意的。 filter_input()
要求您明确指定输入类型。 $_REQUEST
不清楚,它包含来自各种来源的输入,允许一个来源覆盖另一个来源。
除此之外,这也不是警告想要告诉您的内容。将像 $_GET
这样的超全局函数与像 filter_input(INPUT_GET, ...)
这样的超全局函数进行交换显示了相同的设计缺陷。但是 Netbeans 无法就此轻易地向您发出警告。
摆脱超全局变量已经是个好主意。
相反,将输入数据注入(inject)到您的应用程序的低层位置,例如引导请求信息,不要在其余代码中使用任何超全局变量或 filter_input
函数。
这将使您能够轻松模拟任何请求方法,甚至无需实际请求。
关于php - "Do not Access Superglobal $_REQUEST Array Directly."Netbeans 8.0 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331094/