哪些_SERVER美元的变量是安全的?
用户可以控制的任何变量,攻击者也可以控制,因此是攻击的来源。这称为“受污染”变量,并且不安全。
使用 $_SERVER
时,可以控制许多变量。、、 和许多其他是客户端发送的 HTTP 请求标头的一部分。PHP_SELF
HTTP_USER_AGENT
HTTP_X_FORWARDED_FOR
HTTP_ACCEPT_LANGUAGE
有谁知道“安全列表”或未受污染的变量列表?$_SERVER
用户可以控制的任何变量,攻击者也可以控制,因此是攻击的来源。这称为“受污染”变量,并且不安全。
使用 $_SERVER
时,可以控制许多变量。、、 和许多其他是客户端发送的 HTTP 请求标头的一部分。PHP_SELF
HTTP_USER_AGENT
HTTP_X_FORWARDED_FOR
HTTP_ACCEPT_LANGUAGE
有谁知道“安全列表”或未受污染的变量列表?$_SERVER
没有“安全”或“不安全”的值这样的东西。只有服务器控制的值和用户控制的值,您需要知道值的来源,因此是否可以出于特定目的信任它。 例如,存储在数据库中是完全安全的,但我肯定不会。$_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'
* 这些值保证是客户端的有效地址,通过 TCP/IP 握手进行验证。这是任何响应都将发送到的地址。 依赖于反向DNS查找,因此可能会被针对您的服务器的DNS攻击欺骗(在这种情况下,您无论如何都会遇到更大的问题)。此值可能是代理,这是 TCP/IP 协议的简单现实,您对此无能为力。REMOTE_
REMOTE_HOST
†如果您的Web服务器响应任何请求而不考虑标头,则也应将其视为不安全。请参阅$_SERVER有多安全[“HTTP_HOST”]?。
另请参见 http://shiflett.org/blog/2006/mar/server-name-versus-http-host。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'
,(仅适用于 CLI 调用,通常不适用于 Web 服务器)'argc'
'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
在 PHP 中,每个以 开头的变量都可以受到用户的影响。例如,通过将 HTTP 标头设置为 HTTP 请求中的任意值,可以对变量进行污染。$_SERVER
HTTP_
$_SERVER['HTTP_REINERS']
REINERS