SERVER变量是安全的吗?

任何用户可以控制的变量,攻击者也可以控制并因此成为攻击的来源。 这被称为“污染”变量,并且是不安全的。

使用$_SERVER ,可以控制许多变量。 PHP_SELFHTTP_USER_AGENTHTTP_X_FORWARDED_FORHTTP_ACCEPT_LANGUAGE以及许多其他信息都是客户端发送的HTTP请求标头的一部分。

有谁知道一个“安全列表”或$_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握手验证, 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

    完全任意的用户控制值

    这些值根本不被检查,也不依赖于任何服务器配置,它们完全是客户端发送的任意信息。

  • '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还包含几个环境变量。 这些是否“安全”取决于它们的定义方式(以及位置)。 它们可以从完全由服务器控制到完全由用户控制。


    在PHP中,每个以HTTP_开头的$_SERVER变量都会受到用户的影响。 例如,通过将HTTP标头REINERS设置为HTTP REINERS中的任意值,可以污染变量$_SERVER['HTTP_REINERS']

    链接地址: http://www.djcxy.com/p/42259.html

    上一篇: SERVER variables are safe?

    下一篇: POST vs. $