当前位置: 首页 > 面试题库 >

哪些$ _SERVER变量是安全的?

邹英光
2023-03-14
问题内容

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

使用时$_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'

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



 类似资料:
  • 本文向大家介绍Node的全局变量有哪些?相关面试题,主要包含被问及Node的全局变量有哪些?时的应答技巧和注意事项,需要的朋友参考一下 __dirname:当前文件所处目录 __filename:当前文件所处目录+文件名 export:用于导出实现变量 等价于module.export module:CommonJS中的Module的实例

  • 问题内容: 信任安全吗?是否可以通过更改请求标头或类似的内容来代替? 这样写安全吗? 问题答案: 是的,这很安全。它是TCP连接的源IP,不能通过更改HTTP标头代替。 您可能要担心的一种情况是,如果您在反向代理后面,则REMOTE_ADDR将始终是代理服务器的IP,而用户IP将在HTTP标头中提供例如X-Forwarded-For。但是对于正常使用情况,读取REMOTE_ADDR是可以的。

  • 本文向大家介绍哪些集合类是线程安全的?相关面试题,主要包含被问及哪些集合类是线程安全的?时的应答技巧和注意事项,需要的朋友参考一下 Vector、Hashtable、Stack 都是线程安全的,而像 HashMap 则是非线程安全的,不过在 JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就

  • Vector:就比Arraylist多了个同步化机制(线程安全)。 Stack:栈,也是线程安全的,继承于Vector。 Hashtable:就比Hashmap多了个线程安全。 ConcurrentHashMap:是一种高效但是线程安全的集合。

  • 变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。 值得一提的是,Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。 我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,执行命令如下: [r

  • $security true/false, default is false. Security is good for situations when you have untrusted parties editing the templates (via ftp for example) and you want to reduce the risk of system security c