0x00 简介
超级全局变量是在全部作用域中始终可用的内置变量。PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
PHP 超级全局变量有: $GLOBALS 、$_SERVER 、$_REQUEST 、$_POST、$_GET 、$_FILES、$_ENV、$_COOKIE、$_SESSION。
0x01 $GLOBALS
一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
举个例子:
0x02 $_SERVER
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。这也就意味着大量的此类变量都会在» CGI 1.1 规范中说明,所以应该仔细研究一下。
在 $_SERVER 中,你也许能够,也许不能够找到下面的这些元素。注意,如果以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。
PHP_SELF
当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/foo/bar.php 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /foo/bar.php。
SERVER_ADDR
当前运行脚本所在的服务器的 IP 地址。
SERVER_NAME
当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。
Note:
在 Apache 2 里,必须设置 UseCanonicalName = On 和 ServerName。 否则该值会由客户端提供,就有可能被伪造。 上下文有安全性要求的环境里,不应该依赖此值。
上面三个只是冰山一角...... 完整版在这:(确实要花时间好好研究一下)https://www.php.net/manual/zh/reserved.variables.server.php
0x03 $_GET
这个就比较常见了,是通过 URL 参数传递给当前脚本的变量的数组。
Note:
GET 是通过 urldecode()传递的。
0x04 $_POST
当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本。
0x05 $_REQUEST
$_REQUEST默认情况下包含了$_POST,$_GET和$COOKIE的数组。
通过配置php.in中的request_order可以控制$_REQUEST的输出内容(php5.3.0以上版本),这条指令确定了哪些超全局数据该被注册到超全局数组REQUEST中,注册的顺序是从右到左,也就是从左到右依次覆盖,如果request_order = GP,则POST>GET ,如果将request_order 的值设置为 GPC,则$_REQUEST最终只会包含$_COOKIE的内容,如果这个项被设置为空,php将会使用指令variables_order的值来指定。
0x06 $_FILES (文件上传)
通过 HTTP POST 方式上传到当前脚本的项目的数组。
文件上传表单:
以上范例中的 _URL_ 应该被换掉,指向一个真实的 PHP 文件。
MAX_FILE_SIZE 隐藏字段(单位为字节)必须放在文件输入字段之前,其值为接收文件的最大尺寸。这是对浏览器的一个建议,PHP 也会检查此项。在浏览器端可以简单绕过此设置,因此不要指望用此特性来阻挡大文件。实际上,PHP 设置中的上传文件最大值是不会失效的。但是最好还是在表单中加上此项目,因为它可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。
Note:
要确保文件上传表单的属性是 enctype="multipart/form-data",否则文件上传不了。
全局变量 [$_FILES]自 PHP 4.1.0 起存在(在更早的版本中用 $HTTP_POST_FILES 替代)。此数组包含有所有上传的文件信息。
我们假设文件上传的字段的名称如上面表单的例子所示,为userfile。可随意命名。
$_FILES['userfile']['name']
客户端机器文件的原名称。
$_FILE['userfile']['type']
文件的MIME类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。
$_FILE['userfile']['size']
已上传文件的大小,单位为字节。
$_FILE['userfile']['tmp_name']
文件被上传后在服务器端储存的临时文件名
$_FILE['userfile']['error']
和该文件上传相关的错误代码。此项目是在 PHP 4.2.0 版本中增加的。
0x07 $_SESSION
当前脚本可用 SESSION 变量的数组。
您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。
PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
更多地了解session:https://blog.csdn.net/h19910518/article/details/79348051
0x08 $_COOKIE
通过 HTTP Cookies 方式传递给当前脚本的变量的数组。
setcookie - 发送cookie
setcookie(name,value,expire,path,domain,secure)
- name 必需 规定 cookie 的名称。
- value 必需 规定 cookie 的值。
- expire 可选 规定 cookie 的有效期。
......
setcookie() 定义了 Cookie,会和剩下的 HTTP 头一起发送给客户端。 和其他 HTTP 头一样,必须在脚本产生任意输出之前发送 Cookie(由于协议的限制)。 请在产生任何输出之前(包括 和 或者空格)调用本函数。
一旦设置 Cookie 后,下次打开页面时可以使用 $_COOKIE 读取。 Cookie 值同样也存在于$_REQUEST。
Note:
session的数据储存在服务器端,而cookie数据存放在客户端,用户可以修改cookie,从而伪造登录,所以更多地使用seesion会更加安全。
0x09 $_ENV
通过环境方式传递给当前脚本的变量的数组。
这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能运行着不同种类的 Shell,所以不可能有一份确定的列表。请查看你的 Shell 文档来获取定义的环境变量列表。
其他环境变量包含了 CGI 变量,而不管 PHP 是以服务器模块还是 CGI 处理器的方式运行。
参考:
https://www.php.net/manual/zh/language.variables.superglobals.php