PHP 使用 $_SERVER['PHP_SELF'] 獲取當前頁面地址及其安全性問題

PHP $_SERVER['PHP_SELF']

$_SERVER['PHP_SELF'] 表示當前 php 文件相對於網站根目錄的位置地址,與 document root 相關。php

假設咱們有以下網址,$_SERVER['PHP_SELF']獲得的結果分別爲:html

http://www.5idev.com/php/ :/php/index.php
http://www.5idev.com/php/index.php :/php/index.php
http://www.5idev.com/php/index.php?test=foo :/php/index.php
http://www.5idev.com/php/index.php/test/foo :/php/index.php/test/foo

所以,能夠使用 $_SERVER['PHP_SELF'] 很方便的獲取當前頁面的地址:程序員

$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

以上面的地址爲例,獲得的結果以下:安全

http://www.5idev.com/php/index.php

上面是簡單獲取 http 協議的當前頁面 URL ,只是要注意該地址是不包含 URL 中請求的參數(?及後面的字串)的。若是但願獲得包含請求參數的完整 URL 地址,請使用 $_SERVER['REQUEST_URI'] 。服務器

PHP $_SERVER['PHP_SELF'] 安全性

因爲利用 $_SERVER['PHP_SELF'] 能夠很方便的獲取當前頁面地址,所以一些程序員在提交表單數據到當前頁面進行處理時,每每喜歡使用以下這種方式:ide

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

假設該頁面地址爲:post

http://www.5idev.com/php/index.php

訪問該頁面,獲得的表單 html 代碼以下:網站

<form method="post" action="/php/index.php">

這段代碼是正確的,可是當訪問地址變成:url

http://www.5idev.com/php/index.php/test/foo

頁面正常執行了,表單 html 代碼變成:orm

<form method="post" action="/php/index.php/test/foo">

顯然這段代碼不是咱們指望的,攻擊者能夠在 URL 後面隨意加上攻擊代碼。要解決該問題,能夠:

  1. 使用 htmlentities($_SERVER['PHP_SELF']) 替代 $_SERVER['PHP_SELF'],讓 URL 中可能的惡意代碼轉換爲用於顯示的 html 代碼而沒法執行。
  2. 能夠的條件下,使用 $_SERVER['SCRIPT_NAME'] 或 $_SERVER['REQUEST_URI'] 替代 $_SERVER['PHP_SELF']
  3. 在公共代碼裏將 $_SERVER['PHP_SELF'] 進行重寫:
$phpfile = basename(__FILE__);
$_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'], $phpfile)).$phpfile; 

本章節內容共分 6 部分:

  1. 1. PHP 服務器變量 $_SERVER
  2. 2. PHP 服務器環境變量 $_ENV
  3. 3. PHP 使用 $_SERVER['PHP_SELF'] 獲取當前頁面地址及其安全性問題
  4. 4. PHP $_SERVER['HTTP_REFERER'] 獲取前一頁面的 URL 地址
  5. 5. PHP $_SERVER['PHP_SELF']、$_SERVER['SCRIPT_NAME'] 與 $_SERVER['REQUEST_URI'] 之間的區別
  6. 6. PHP $_SERVER['SCRIPT_FILENAME'] 與 __FILE__ 的區別
相關文章
相關標籤/搜索