在实际使用之前我是否必须检查$_SERVER
变量是否有键?REQUEST_METHOD
$_SERVER['REQUEST_METHOD']
也就是说,总是检查数组变量中是否存在键是否过于防御$_SERVER
?
在实际使用之前我是否必须检查$_SERVER
变量是否有键?REQUEST_METHOD
$_SERVER['REQUEST_METHOD']
也就是说,总是检查数组变量中是否存在键是否过于防御$_SERVER
?
由于您无法真正保证任何 PHP 数组将具有哪些键,因此您应该始终检查它们。这并不过分防御,对你来说是一种很好的做法。
为了其他有类似问题的读者,您通常会在以下三种检查数组的方法中进行选择:
array_key_exists("REQUEST_METHOD", $_SERVER)
或者
isset($_SERVER['REQUEST_METHOD'])
否则你应该用@来逃避警告:
$someVar = @$_SERVER['REQUEST_METHOD'];
绝对不推荐最后一个选项,因为它往往会隐藏问题,所以我会坚持检查任何数组(甚至是全局 PHP 数组)上是否存在键的做法。
PHP 手册中关于 $_SERVER 变量的内容如下:
无法保证每个 Web 服务器都会提供其中任何一个;服务器可能会省略一些,或提供此处未列出的其他内容。也就是说,在 » CGI/1.1 规范中包含了大量这些变量,因此您应该能够预料到这些变量。
CGI/1.1 规范有以下说法:
REQUEST_METHOD 元变量必须设置为
脚本应该用来处理请求的方法,如
4.3 节所述。
和
在 REQUEST_METHOD 元变量中提供的请求方法标识了脚本在
产生响应时要应用的处理方法。脚本作者可以选择实现
最适合特定应用程序的方法。如果
脚本接收到一个不支持它的方法的请求,应该以错误拒绝它(参见第 6.3.3 节)。
如果您不进行任何 CLI 开发并且脚本只会从像 Apache 这样的服务器运行,则可能没有必要检查它的存在性。为了安全起见,您可能可以这样做,但这没有必要。
如果您的脚本对 in 的值感兴趣,REQUEST_METHOD
那么它可能是从 Web 浏览器而不是 CLI 运行的,所以在这种情况下,我不会费心去做isset()
检查。REQUEST_METHOD
除非从 CLI 运行,否则将始终存在,因为根据 HTTP 的定义,浏览器无法在没有请求方法的情况下请求页面。