PHP GPC關閉指的是關閉PHP的全局變量、魔術變量和$_COOKIE的預處理。平時我們使用PHP時,當我們提交一個表單或者發送一個HTTP請求時,PHP會自動處理一些全局變量和魔術變量,并且從$_COOKIE中獲取cookie數據,這些被預處理過的數據就稱之為GPC。但是,開啟GPC會帶來一些安全風險,攻擊者可以通過一些手段注入惡意代碼。因此,在一些高安全性要求的應用中,我們需要關閉GPC,手動處理這些數據。
舉個例子,假設我們有一個表單需要提交用戶的帳號和密碼,我們使用GPC打開,代碼看起來會非常簡單:
$username = $_POST['username']; $password = $_POST['password'];
此時,我們可以直接使用$username和$password這兩個變量了。但是,如果攻擊者向這個表單中注入了一些惡意代碼,我們的應用就會處于安全性風險之中。為了關閉GPC,我們需要手動處理這些數據:
$username = isset($_POST['username']) ? $_POST['username'] : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; $username = htmlspecialchars($username, ENT_QUOTES | ENT_HTML5, 'UTF-8', false); $password = htmlspecialchars($password, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
在這里,我們首先使用了isset()函數來判斷這兩個變量是否存在;如果存在,則使用htmlspecialchars()函數將其轉義。這里我們采用的是ENT_QUOTES和ENT_HTML5兩個參數,前者代表轉義單引號和雙引號,后者代表轉義所有的html特殊字符。第四個參數false表示不進行二次編碼。
除了表單數據,我們還需要關注URL參數和cookie數據。對于URL參數和cookie數據,我們同樣需要手動處理。舉個例子,我們使用GPC打開獲取cookie的方式是這樣的:
$cookie = $_COOKIE['mycookie'];
關閉GPC后,我們需要這樣來獲取cookie:
$cookie = isset($_COOKIE['mycookie']) ? $_COOKIE['mycookie'] : ''; $cookie = htmlspecialchars($cookie, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
需要注意的是,在關閉GPC的情況下,我們需要手動處理所有從客戶端傳來的數據。否則,我們的應用就會處于安全性風險之中。因此,在開發高安全性要求的應用時,關閉GPC是非常必要的。