| 方式 | 數據可見性 | 長度限制 | 適用場景 | 安全性 |
|---|---|---|---|---|
| POST | 不可見(請求體) | 無實質限制(受 post_max_size) | 表單提交、修改/刪除操作、敏感數據 | 較高 |
| GET | 可見(URL 參數) | ~2KB(瀏覽器/服務器限制) | 查詢、分頁、分享鏈接、幂等操作 | 低(參數暴露在歷史/日誌) |
| Session | 服務端存儲,客戶端僅 Cookie ID | 受 session 存儲引擎限制 | 用戶登錄態、購物車、多步驟向導數據 | 高(需防 Session 劫持) |
<!-- form.html -->
<form action="handle.php" method="post">
<input type="text" name="username" placeholder="用戶名" required>
<input type="password" name="pwd" placeholder="密碼" required>
<input type="hidden" name="csrf_token" value="<?= generate_csrf_token() ?>">
<button type="submit">提交</button>
</form>
<?php
// handle.php
session_start();
// 1. CSRF 驗證
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
die('非法請求');
}
// 2. 獲取並過濾
$username = trim(filter_input(INPUT_POST, 'username', FILTER_SANITIZE_SPECIAL_CHARS));
$pwd = $_POST['pwd']; // 密碼不建議過濾,直接驗證哈希
// 3. 業務邏輯...
echo "接收到:$username";
?>
隱藏域技巧:<input type="hidden" name="redirect_url" value="/dashboard"> 可在不暴露給用戶的情況下傳遞跳轉目標。
<!-- 列表頁 -->
<a href="delete.php?id=1001&token=<?= urlencode($_SESSION['csrf_token']) ?>">刪除</a>
<a href="detail.php?id=1001">詳情</a>
<?php
// delete.php
if (!isset($_GET['id'], $_GET['token'])) die('參數缺失');
$id = (int)$_GET['id']; // 強制轉型防注入
// 驗證 token...
// 執行刪除...
header('Location: list.php');
?>
注意:GET 請求不應修改服務端狀態(刪除/修改),否則違反 HTTP 語義且易遭 CSRF。實際項目中刪除操作應用 POST/DELETE + CSRF Token。
<?php
// login.php - 登錄成功後
session_start();
// 驗證賬號密碼...
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['roles'] = $user['roles'];
// 設置 Session 過期時間(如 30 分鐘無操作)
ini_set('session.gc_maxlifetime', 1800);
session_set_cookie_params(1800);
header('Location: dashboard.php');
?>
<?php
// dashboard.php - 受保護頁面
session_start();
if (empty($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
$userId = $_SESSION['user_id'];
$username = $_SESSION['username'];
// 業務邏輯...
?>
<?php
// logout.php
session_start();
$_SESSION = []; // 清空數據
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}
session_destroy();
header('Location: login.php');
?>
htmlspecialchars($str, ENT_QUOTES, 'UTF-8')。session.cookie_httponly=1、session.cookie_secure=1(HTTPS)、定期 session_regenerate_id(true)。password_hash(),不在 Session/GET/POST 明文傳輸。