6

在实际使用之前我是否必须检查$_SERVER变量是否有键?REQUEST_METHOD$_SERVER['REQUEST_METHOD']

也就是说,总是检查数组变量中是否存在键是否过于防御$_SERVER

4

3 回答 3

5

由于您无法真正保证任何 PHP 数组将具有哪些键,因此您应该始终检查它们。这并不过分防御,对你来说是一种很好的做法。

为了其他有类似问题的读者,您通常会在以下三种检查数组的方法中进行选择:

array_key_exists("REQUEST_METHOD", $_SERVER)

或者

isset($_SERVER['REQUEST_METHOD'])

否则你应该用@来逃避警告:

$someVar = @$_SERVER['REQUEST_METHOD'];

绝对不推荐最后一个选项,因为它往往会隐藏问题,所以我会坚持检查任何数组(甚至是全局 PHP 数组)上是否存在键的做法。

于 2012-12-26T20:59:57.223 回答
5

PHP 手册中关于 $_SERVER 变量的内容如下:

无法保证每个 Web 服务器都会提供其中任何一个;服务器可能会省略一些,或提供此处未列出的其他内容。也就是说,在 » CGI/1.1 规范中包含了大量这些变量,因此您应该能够预料到这些变量。

CGI/1.1 规范有以下说法:

REQUEST_METHOD 元变量必须设置为
脚本应该用来处理请求的方法,如
4.3 节所述。

在 REQUEST_METHOD 元变量中提供的请求方法标识了脚本在
产生响应时要应用的处理方法。脚本作者可以选择实现
最适合特定应用程序的方法。如果
脚本接收到一个不支持它的方法的请求,应该以错误拒绝它(参见第 6.3.3 节)。

如果您不进行任何 CLI 开发并且脚本只会从像 Apache 这样的服务器运行,则可能没有必要检查它的存在性。为了安全起见,您可能可以这样做,但这没有必要。

于 2012-12-26T21:00:09.117 回答
1

如果您的脚本对 in 的值感兴趣,REQUEST_METHOD那么它可能是从 Web 浏览器而不是 CLI 运行的,所以在这种情况下,我不会费心去做isset()检查。REQUEST_METHOD除非从 CLI 运行,否则将始终存在,因为根据 HTTP 的定义,浏览器无法在没有请求方法的情况下请求页面。

于 2012-12-26T21:06:36.920 回答