哪些$ _SERVER变量是安全的?

| 用户可以控制的任何变量,攻击者也可以控制,因此是攻击的源头。这被称为“污染”变量,并且不安全。 使用
$_SERVER
时,可以控制许多变量。
PHP_SELF
HTTP_USER_AGENT
HTTP_X_FORWARDED_FOR
HTTP_ACCEPT_LANGUAGE
以及许多其他内容是客户端发送的HTTP请求标头的一部分。 有人知道“ 0”变量的“安全列表”或无污染列表吗?     
已邀请:
        这样就没有\“ safe \”或\“ unsafe \”值。只有服务器控制的值和用户控制的值,您需要知道值的来源,因此是否可以出于特定目的信任它。例如,将“ 6”存储在数据库中是完全安全的,但是我肯定不会选择“ 7”。 因此,让我们将这些值分为三类: 服务器控制 这些变量由服务器环境设置,并且完全取决于服务器配置。
\'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服务器处理,则可以认为是可靠的。 超全局变量“ 0”还包含多个环境变量。这些是否“安全”取决于它们的定义方式(和位置)。它们的范围从完全由服务器控制到完全由用户控制。     
        在PHP中,以
HTTP_
开头的每个
$_SERVER
变量都会受到用户的影响。例如,可以通过将HTTP标头“ 53”设置为HTTP请求中的任意值来污染变量“ 52”。     

要回复问题请先登录注册