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]

會將請求的個人資料放入 showprofile.php 頁面中的 $profile 變數中。

您可以進一步增強網址(例如 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;

因此,如果您要在網址中使用 $_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'] 時要小心。網頁伺服器 (IIS) 並不總是支援它。
匿名
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 年前
因此,您的網路空間中有一個應用程式,其網址如下所示

http://<主機>/<安裝路徑>/

以及網頁,例如

http://<主機>/<安裝路徑>/子資料夾1/子資料夾2/page.php

您在 <安裝路徑> 中有一個名為 config.php 的檔案,所有頁面(無論是否在子資料夾中)都會 include() 它。

如何在不將 <安裝路徑> 硬編碼到設定檔的情況下算出它?

<?php

// 這是 config.php,它位於 <安裝路徑>
// 它被 <安裝路徑>/page.php 引入
// 它被 <安裝路徑>/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 = $_MY_PATH_PART
? substr( dirname($_SERVER['SCRIPT_NAME']), 0, -strlen($_MY_PATH_PART) )
:
dirname($_SERVER['SCRIPT_NAME'])
;
// 我們從 <安裝路徑> 的末尾減去子資料夾部分,只留下 <安裝路徑> :)

?>
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,因為我的網路伺服器位於反向代理伺服器之後。
這可以確保安全
將反向代理伺服器設定為封鎖此欄位,並正確覆寫它。
將 Apache 伺服器設定為僅接受來自反向代理伺服器的連入連線。
To Top