在EP04介紹超全域變數時,曾提及$_SERVER、$_POST、$_GET這三個常見用於表單驗證的內建全域變數
當按下送出表單的按鈕(HTML button)後,表單會透過設定的方法(GET或POST)將資料送到 form action 屬性設定的目標網址,這個時候必須要用 PHP 的 $_POST 或 $_GET 變數來接收資料,本篇要介紹 PHP 接收 Form 的過程與範例。
表單處理入門
當使用者填寫完表單並點擊提交按鈕後,表單資料將會被傳送到名為「form.php」的PHP 檔案進行處理,而表單資料透過 HTTP POST 方法發送,透過超全域變數$_POST顯示哪位貴賓登入。
<?PHP
echo "welcome".$_POST['account'];
?>
完成了簡易的表單處理後,會發現缺乏安全性,最常見的就是 XSS(Cross-Site Scripting,跨站腳本攻擊)。
XSS(Cross-Site Scripting,跨站腳本攻擊)
XSS (cross-site scripting) 是很常見的網路攻擊,利用網站中的漏洞,透過 HTTP 網路請求注入惡意腳本,網路伺服器執行客戶端腳本,從而實現內容操控或資料竊取,也就是惡意用戶會張貼 JavaScript 代碼上來,當其他用戶瀏覽到這一頁時,瀏覽器就會執行 JavaScript 代碼。
那該如何防範呢?
本篇要介紹的就是後端針對任何允許用戶輸出的內容都要檢查以及刪除相關的關鍵字指令等等。
第一步:
第一步先確認表單傳遞方式是不是透過 POST 或是 GET,這是最重要的守門員。如果沒有這一行,當你第一次打開網頁(還沒填表單)時,PHP 就會急著去抓 $_POST,結果抓不到就會報錯 (Warning)。這行程式碼確保了「只有按了按鈕送出表單後,才開始檢查」。
<?PHP
if($_SERVER['REQUEST_METHOD'] == 'POST'){
echo "welcome".$_POST['account'];
}
?>
第二步:
這是一個防護罩。如果駭客在 Email 欄位輸入 <script>alert('Hacked')</script>,這個函式會把它轉譯成無害的純文字。在台灣的資安規範中,這是防止 XSS (Cross-Site Scripting 跨網站指令碼攻擊) 的基本功。
<?PHP
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$account = htmlspecialchars($_POST['account']);
$password = htmlspecialchars($_POST['pw']);
echo "welcome".$account;
}
?>
第3、4行用變數 $account 以及 $password 來儲存所接收到的資料,這裡要注意的是 $_POST不等於$_post,大小寫是完全不一樣的事情,根據 PHP 的規則,若寫成小寫會失效。
第三步:
最後根據表單發送的資料做比對,將最終結果顯示在網頁上。
<?PHP
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$account = htmlspecialchars($_POST['account']);
$password = htmlspecialchars($_POST['pw']);
if(!empty($password)){
if($password == "1234"){
echo "welcome".$account;
}
else{
echo "password is error";
}
}
else{
echo "password is missing";
}
}
?>
常用於驗證的函式
htmlspecialchars()
PHP 防範 XSS 的重要工具,能夠把預定義字符(< > & ' ")轉換成HTML可以顯示出來的符號,讓輸入的東西變成純文字,不被解釋為 HTML 或是 Js 。
isset()
檢查變數是否存在(undefined、沒有初始值、null)且值不為 null,回傳 true,反之。
常用於檢查變數以及陣列中的 key 是否存在。
<?php
$var = 1;
$var1 = "";
$var2 = null;
$var3 = [];
$var4;
echo var_dump(isset($var)); //輸出bool(true)
echo var_dump(isset($var1)); //輸出bool(true)
echo var_dump(isset($var2)); //輸出bool(false)
echo var_dump(isset($var3)); //輸出bool(true)
echo var_dump(isset($var4)); //輸出bool(false)
echo var_dump(isset($var5)); //輸出bool(false)
?>
除了一次檢查一個變數以外也可以一次檢查多個,只要其中一個為 false,就會回傳false。
<?php
echo var_dump(isset($var, $var1, $var2, $var3));//輸出bool(false)
?
empty()
檢查變數是否為空值,如果為空,回傳 true,反之。
❗特別的是,即使是空字串""、整數0、0.0、"0"、null、false、[]、$var 以及undefined都會被判定為空。
<?php
$var = 0;
$var1 = "0";
$var2 = null;
$var3 = [];
$var4 = 0.0;
$var5 = false;
$var6 = "";
$var7 ;
echo var_dump(empty($var)); //輸出為bool(true)
echo var_dump(empty($var1)); //輸出為bool(true)
echo var_dump(empty($var2)); //輸出為bool(true)
echo var_dump(empty($var3)); //輸出為bool(true)
echo var_dump(empty($var4)); //輸出為bool(true)
echo var_dump(empty($var5)); //輸出為bool(true)
echo var_dump(empty($var6)); //輸出為bool(true)
echo var_dump(empty($var7)); //輸出為bool(true)
echo var_dump(empty($var8)); //輸出為bool(true)
?>
is_null()
檢查變數是否為 null,如果為 null,回傳 true,反之。
<?php
$var = 0;
$var1 = "0";
$var2 = null;
$var3 = [];
$var4 = 0.0;
$var5 = false;
$var6 = "";
$var7 ;
echo var_dump(is_null($var)); //輸出為boll(false)
echo var_dump(is_null($var1)); //輸出為boll(false)
echo var_dump(is_null($var2)); //輸出為boll(true)
echo var_dump(is_null($var3)); //輸出為boll(false)
echo var_dump(is_null($var4)); //輸出為boll(false)
echo var_dump(is_null($var5)); //輸出為boll(false)
echo var_dump(is_null($var6)); //輸出為boll(false)
echo var_dump(is_null($var7)); //輸出為boll(true)
echo var_dump(is_null($var8)); //輸出為boll(true)
?>
本篇文章到這裡就結束了,如果喜歡我的文章或覺得有用的話,歡迎動動手指點擊愛心,你/妳的支持是我最大的動力,我們下篇文章見🙌。




















