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