文章

PHP - 表單處理


課程簡介

表單處理是 PHP 網頁開發中非常重要的一環,用於接收和處理用戶輸入的數據。本課程將介紹如何建立 HTML 表單,使用 PHP 獲取數據,並實現數據驗證與安全性措施。


表單處理基本概念

1. 表單結構

使用 HTML 表單標籤定義用戶輸入界面。
範例:

1
2
3
4
5
6
7
8
9
<form action="process.php" method="post">
    <label for="name">姓名:</label>
    <input type="text" id="name" name="name">
    <br>
    <label for="email">電子郵件:</label>
    <input type="email" id="email" name="email">
    <br>
    <button type="submit">送出</button>
</form>
  • action:指定提交表單數據的伺服器端腳本。
  • methodGETPOST,用於選擇數據提交方式。

2. 獲取表單數據

使用 $_POST

當表單使用 POST 方法提交時,數據會存放在全域陣列 $_POST 中。
範例:

1
2
3
4
5
6
7
8
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = $_POST["name"];
    $email = $_POST["email"];
    echo "姓名:$name<br>";
    echo "電子郵件:$email";
}
?>

使用 $_GET

當表單使用 GET 方法提交時,數據會存放在 $_GET 中。
範例:

1
2
3
4
5
6
7
8
<?php
if ($_SERVER["REQUEST_METHOD"] == "GET") {
    $name = $_GET["name"];
    $email = $_GET["email"];
    echo "姓名:$name<br>";
    echo "電子郵件:$email";
}
?>

3. 簡單表單驗證

在伺服器端對表單數據進行驗證,避免不合法輸入。
範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = trim($_POST["name"]);
    $email = trim($_POST["email"]);
    
    if (empty($name)) {
        echo "姓名不可為空<br>";
    } else {
        echo "姓名:$name<br>";
    }

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        echo "電子郵件格式不正確<br>";
    } else {
        echo "電子郵件:$email";
    }
}
?>

4. 表單的安全性

防止 XSS(跨站腳本攻擊)

對用戶輸入進行編碼處理,避免惡意代碼被執行。
範例:

1
2
3
4
5
6
<?php
$name = htmlspecialchars($_POST["name"]);
$email = htmlspecialchars($_POST["email"]);
echo "姓名:$name<br>";
echo "電子郵件:$email";
?>

防止 CSRF(跨站請求偽造)

使用 CSRF Token 確保表單請求的合法性。
範例:

  1. 在表單中加入隱藏的 CSRF Token:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    <?php
    session_start();
    $token = bin2hex(random_bytes(32));
    $_SESSION["csrf_token"] = $token;
    ?>
    <form action="process.php" method="post">
        <input type="hidden" name="csrf_token" value="<?php echo $token; ?>">
        <!-- 其他表單欄位 -->
    </form>
    
  2. 在伺服器端驗證 Token:
    1
    2
    3
    4
    5
    6
    
    <?php
    session_start();
    if ($_POST["csrf_token"] !== $_SESSION["csrf_token"]) {
        die("CSRF 驗證失敗!");
    }
    ?>
    

教學練習

練習 1:建立簡單表單並回顯輸入數據

建立一個表單,包含「姓名」與「年齡」兩個欄位,提交後顯示輸入的值。


練習 2:表單驗證

擴展上述表單,加入以下驗證:

  1. 姓名不可為空。
  2. 年齡必須為數字且在 1 到 120 之間。

練習 3:安全性處理

為上述表單加入 XSS 防護與 CSRF 驗證。


教學重點

  • 掌握如何使用 $_POST$_GET 獲取表單數據。
  • 熟悉基本表單驗證技巧,確保數據的合法性。
  • 理解 XSS 和 CSRF 攻擊的原理,並學會應對措施。

本文章以 CC BY 4.0 授權