就没有这样的“安全”或“不安全”值。只有服务器控制的值和用户控制的值,您需要知道值的来源,因此是否可以出于特定目的信任该值。$_SERVER['HTTP_FOOBAR']
例如,将其完全安全地存储在数据库中,但我绝对不是eval
。
因此,让我们将这些值分为三类:
服务器控制
这些变量由服务器环境设置,并且完全取决于服务器配置。
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
部分受服务器控制
这些变量取决于客户端发送的特定请求,但只能采用有限数量的有效值,因为所有无效值都应由Web服务器拒绝,并且不会导致脚本的调用开始。因此,可以认为它们是可靠的。
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* REMOTE_
通过TCP / IP握手验证,这些值保证是客户端的有效地址。这是将任何响应发送到的地址。REMOTE_HOST
但是,它依赖于反向DNS查找,因此可能会受到针对您服务器的DNS攻击的欺骗(在这种情况下,无论如何您都会遇到更大的问题)。该值可能是代理,这是TCP / IP协议的简单现实,您无能为力。
†如果您的Web服务器响应任何请求而无论HOST
标头如何,这也应被视为不安全。请参阅$ _SERVER [“ HTTP_HOST”]有多安全?。
另请参阅http://shiflett.org/blog/2006/mar/server-name-versus-http-host。
‡见https://bugs.php.net/bug.php?id=64457,http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport,HTTP://httpd.apache。 org / docs / 2.4 / mod / core.html#comment_999
完全任意的用户控制值
这些值根本不会检查,也不依赖于任何服务器配置,它们完全是客户端发送的任意信息。
'argv'
,'argc'
(仅适用于CLI调用,通常不涉及Web服务器)
'REQUEST_METHOD'
§
'QUERY_STRING'
'HTTP_ACCEPT'
'HTTP_ACCEPT_CHARSET'
'HTTP_ACCEPT_ENCODING'
'HTTP_ACCEPT_LANGUAGE'
'HTTP_CONNECTION'
'HTTP_REFERER'
'HTTP_USER_AGENT'
'AUTH_TYPE'
‖
'PHP_AUTH_DIGEST'
‖
'PHP_AUTH_USER'
‖
'PHP_AUTH_PW'
‖
'PATH_INFO'
'ORIG_PATH_INFO'
'REQUEST_URI'
(可能包含污染数据)
'PHP_SELF'
(可能包含污染数据)
'PATH_TRANSLATED'
- 任何其他
'HTTP_'
值
§ 只要Web服务器仅允许某些请求方法,就可以认为是可靠的。
‖ 如果身份验证完全由Web服务器处理,则可以认为是可靠的。
超全局变量$_SERVER
还包括几个环境变量。这些是否“安全”取决于它们的定义方式(和位置)。它们的范围从完全由服务器控制到完全由用户控制。