哪个$ _SERVERvariables是安全的?
任何用户可以控制的variables,攻击者也可以控制,因此是攻击的来源。 这被称为“污染”variables,是不安全的。
当使用$_SERVER ,可以控制许多variables。  PHP_SELF , HTTP_USER_AGENT , HTTP_X_FORWARDED_FOR , HTTP_ACCEPT_LANGUAGE和许多其他都是客户端发送的HTTP请求头的一部分。 
 有谁知道一个“安全列表”或$_SERVERvariables的无名列表? 
 没有像这样的“安全”或“不安全”的价值。 只有服务器控制的值和用户控制的值才需要知道值来自哪里,因此是否可以为某个特定目的信任它。  $_SERVER['HTTP_FOOBAR']例如是完全安全的存储在数据库中,但我当然不会评价它。 
因此,我们将这些值分为三类:
服务器控制
这些variables是由服务器环境设置的,完全取决于服务器configuration。
-  'GATEWAY_INTERFACE'
-  'SERVER_ADDR'
-  'SERVER_SOFTWARE'
-  'DOCUMENT_ROOT'
-  'SERVER_ADMIN'
-  'SERVER_SIGNATURE'
部分由服务器控制
这些variables取决于客户端发送的特定请求,但只能使用有限数量的有效值,因为所有无效值都应该被Web服务器拒绝,并且不会引起脚本的调用。 因此他们可以被认为是可靠的 。
-  'HTTPS'
-  'REQUEST_TIME'
-   'REMOTE_ADDR'*
-   'REMOTE_HOST'*
-   'REMOTE_PORT'*
-  'SERVER_PROTOCOL'
-   'HTTP_HOST'†
-   'SERVER_NAME'†
-  'SCRIPT_FILENAME'
-   'SERVER_PORT'‡
-  'SCRIPT_NAME'
  *通过TCP / IP握手validation, REMOTE_值保证是客户端的有效地址。 这是任何回应将被发送到的地址。  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 。组织/文档/ 2.4 / MOD / core.html#comment_999
完全任意的用户控制值
这些值根本不被检查,也不依赖于任何服务器configuration,它们完全是客户端发送的任意信息。
-   '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服务器只允许某些请求方法,可以被认为是可靠的 。
‖如果authentication完全由networking服务器处理,则认为可靠 。
 超全局$_SERVER还包含几个环境variables。 这些是否“安全”取决于它们如何(以及在哪里)被定义。 它们可以从完全服务器控制到完全由用户控制。 
 在PHP中,每个以HTTP_开头的$_SERVERvariables都会受到用户的影响。 例如,通过将HTTP标头REINERS设置为HTTP REINERS中的任意值,可以污染variables$_SERVER['HTTP_REINERS'] 。