2024 年 PHP 日本大会

预定义变量

PHP 提供预定义变量,这些变量代表外部变量、内置环境变量以及有关执行环境的其他信息,例如在 CLI 环境中传递给脚本的参数的数量和值。

目录

添加注释

用户贡献的注释 16 条注释

New York PHP
19 年前
警告:$_SERVER['PHP_SELF'] 可能包含任意用户输入。文档应更新以反映这一点。

请求"http://example.com/info.php/attack%20here" 将运行 /info.php,但在 Apache 中 $_SERVER['PHP_SELF'] 将等于 "/info.php/attack here"。这是一个特性,但这意味着必须将 PHP_SELF 视为用户输入。

攻击字符串可能包含 URL 编码的 HTML 和 JavaScript(跨站点脚本)或 URL 编码的换行符(HTTP 响应拆分)。

建议改用 $_SERVER['SCRIPT_NAME']。
nathan
18 年前
同样,关于使用 IP 地址查找国家/地区和城市,请注意,您得到的结果可能并不完全准确。如果他们的 ISP 位于不同的城市或省份/州,则 IP 地址可能归总部所有,并在多个地区使用。
您还会遇到更罕见的情况,例如他们可能在旅途中、在工作中或朋友家通过 SSH 连接到另一台服务器……这是一个不错的想法,但如示例代码所示,它仅应用于设置默认值。
danvasile at pentest dot ro
17 年前
如果您在使用 $_SERVER['HTTPS'] 时遇到问题,特别是如果它根本不返回任何值,则应检查 phpinfo() 的结果。它可能根本不会列出。
这是一个检查并在必要时更改为 ssl/https 的解决方案,它在所有情况下都能正常工作

<?php
if ($_SERVER['SERVER_PORT']!=443) {
$sslport=443; // 无论您的 ssl 端口是什么
$url = "https://". $_SERVER['SERVER_NAME'] . ":" . $sslport . $_SERVER['REQUEST_URI'];
header("Location: $url");
}
?>

当然,这应该在任何 html 标签或 php echo/print 之前完成。
Joe Marty
17 年前
我认为需要注意的是,PHP 将自动将传入的 POST 或 GET(或 REQUEST)变量中的点('.')和空格(' ')替换为下划线('_')非常重要。

此页面提到了点替换,但没有提到空格替换
http://us2.php.net/manual/en/language.variables.external.php

原因是 '.' 和 ' ' 不是在变量名中使用的有效字符。这令许多人感到困惑,因为大多数人使用 $_POST['name'] 格式来访问这些值。在这种情况下,名称不用作变量名,而是用作数组索引,在其中这些字符是有效的。

但是,如果设置了 register_globals 指令,则必须将这些名称用作变量名。目前,PHP 在将这些变量插入外部变量数组之前会转换这些变量的名称,而不是将它们保留在数组中,只更改 register_globals 设置的变量的名称。

如果您想使用
<input name="title for page3.php" type="text">

例如,您将在 POST 数组中获得的值将是
$_POST['title_for_page3_php']
Nicolae Namolovan
17 年前
安全风险!

切勿相信来自 $_SERVER 的值。

HTTP_X_FORWARDED、HTTP_X_FORWARDED_FOR、HTTP_FORWARDED_FOR、HTTP_FORWARDED 等可以被伪造!

要获取用户的 IP 地址,仅使用 $_SERVER['REMOTE_ADDR'],否则用户的“IP”可以很容易地通过发送 HTTP_X_* 头来更改,因此用户可以逃避封禁或伪造可信的 IP 地址。

当然,这是众所周知的,但我没有在这些注释中看到它。

如果您仅将 IP 地址用于跟踪(不用于任何安全功能,例如禁止或通过 IP 地址允许访问某些内容),您还可以使用 HTTP_X_FORWARDED 获取位于代理后面的用户的 IP 地址。
jameslporter at gmail dot com
18 年前
如果您没有在 $_SERVER[SERVER_NAME] 变量中获取 ServerName,请参考 CanonicalName……这对我来说很难解决……现在通过打开规范命名可以按预期工作。

http://www.apacheref.com/ref/http_core/UseCanonicalName.html
drew dot griffiths at clare dot net
19 年前
关于:您可以利用 404 错误进行有用的重定向,使用 REQUEST_URI……

虽然这很有效,但 .htaccess 中的一行,例如

RewriteEngine On
RewriteRule ^profiles/([A-Za-z0-9-]+) showprofile.php?profile=$1 [L,NC,QSA]

会将请求的配置文件放入变量 $profile 中,传递到 showprofile.php 页面。

您可以进一步增强URL(例如 http://servername/profiles/Jerry/homeaddress/index.htm),当使用以下代码时,第二个变量值homeaddress可以在$url_array[3]中获得:`$url_array=explode("/",$_SERVER['REQUEST_URI']);`

希望这有帮助 - 对我来说效果很好

Drew
Aardvark
18 年前
$_GET可能无法处理包含转义Unicode值的查询字符串参数值,这些值是通过将JavaScript的“escape”函数应用于Unicode字符串生成的。
为了处理这个问题,可以使用以下函数获取查询参数值:

function getQueryParameter ($strParam) {
$aParamList = explode('&', $_SERVER['QUERY_STRING']);
$i = 0;
while ($i < count($aParamList)) {
$aParam = split('=', $aParamList[$i]);
if ($strParam == $aParam[0]) {
return $aParam[1];
}
}
return "";
}

或者通过直接构建查询字符串值的数组,然后使用诸如“unescape”之类的函数处理参数字符串,该函数可以在 http://www.kanolife.com/escape/2006/03/unicode-url-escapes-in-php.html (或 http://www.kanolife.com/escape/ 获取相关信息)找到。
Gregory Boshoff
19 年前
$_SERVER['QUERY_STRING']

不包含符合XHTML 1.1规范的与符号,即&amp;。

因此,如果您要在URL中使用$_SERVER['QUERY_STRING'],则需要执行以下操作。

// 符合XHTML 1.1规范的与符号
$_SERVER['QUERY_STRING'] =
str_replace(array('&amp;', '&'), array('&', '&amp;'),
$_SERVER['QUERY_STRING']);
mrnopersonality at yahoo dot com
20年前
关于消息正文的内容…

您可以获取cookie、会话变量、报头、请求URI、请求方法等,但无法获取消息正文。当您的页面需要使用POST方法请求时,您有时可能需要它。

也许他们应该提到$HTTP_RAW_POST_DATA或php://stdin
youdontmeanmuch [at] yahoo.com
20年前
在将应用程序分发给使用不同服务器类型的其他人时,小心使用$_SERVER['DOCUMENT_ROOT'];它并不总是受Web服务器(IIS)支持。
Anonymous
18 年前
我无法说服我的主机公司更改他们的PHP安装,因此不得不自己寻找计算$_SERVER["DOCUMENT_ROOT"]的方法。最终我选择了以下方法,它是早期笔记的组合(已更正一些错别字)

<?php
if ( ! isset($_SERVER['DOCUMENT_ROOT'] ) )
$_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr(
$_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF']) ) );
?>
Ben XO
18 年前
因此,您的网络空间中有一个应用程序,其URL如下所示

http://<host>/<installation_path>/

以及诸如以下的页面:

http://<host>/<installation_path>/subfolder1/subfolder2/page.php

您在<installation_path>中有一个名为config.php的文件,所有页面(在子文件夹中或不在子文件夹中)都包含它。

如何在不将其硬编码到配置文件中的情况下计算出<installation_path>?

<?php

// 这是config.php,它位于<installation_path>中
// 它被<installation_path>/page.php包含
// 它被<installation_path>/subfolder/page2.php包含
// 等等

$_REAL_SCRIPT_DIR = realpath(dirname($_SERVER['SCRIPT_FILENAME'])); // 此页面的目录的文件系统路径 (page.php)
$_REAL_BASE_DIR = realpath(dirname(__FILE__)); // 此文件目录的文件系统路径 (config.php)
$_MY_PATH_PART = substr( $_REAL_SCRIPT_DIR, strlen($_REAL_BASE_DIR)); // <installation_path>和页面之间的子文件夹部分

$INSTALLATION_PATH = $_MY_PATH_PART
? substr( dirname($_SERVER['SCRIPT_NAME']), 0, -strlen($_MY_PATH_PART) )
:
dirname($_SERVER['SCRIPT_NAME'])
;
// 我们从<installation_path>的末尾减去子文件夹部分,只留下<installation_path> :)

?>
Gregory Boshoff
19 年前
环境变量$ENV对于编写可移植的平台特定应用程序常量非常有用。

// 定义Windows或其他Linux根目录路径
$_ENV['OS'] == 'Windows_NT' ? $path = 'L:\\www\\' : $path = ' /var/www/';

define('PATH', $path);

echo PATH;
mfyahya at gmail dot com
19 年前
如果您使用Apache的重定向功能来创建自定义错误页面或其他内容,则以下Apache的REDIRECT变量也可在$_SERVER中使用
$_SERVER['REDIRECT_UNIQUE_ID]'
$_SERVER['REDIRECT_SCRIPT_URL]'
$_SERVER['REDIRECT_SCRIPT_URI]'
$_SERVER['REDIRECT_SITE_ROOT]'
$_SERVER['REDIRECT_SITE_HTMLROOT]'
$_SERVER['REDIRECT_SITE_CGIROOT]'
$_SERVER['REDIRECT_STATUS]'
$_SERVER['REDIRECT_QUERY_STRING]'
$_SERVER['REDIRECT_URL]'

不过,我不确定这是否是一个完整的列表
dusted at dusted dot dk
13年前
我使用HTTP_X_FORWARDED_FOR,因为我的Web服务器位于反向代理之后。
这可以被安全地实现
配置反向代理以阻止此字段,并正确覆盖它。
配置Apache服务器仅接受来自反向代理的传入连接。
To Top