多步驟表單、付款流程、引導式精靈等需強制單向導航的情境,防止使用者按「上一頁」造成資料重複提交或狀態錯亂。
<?php
session_start();
// 進入步驟 2 的標記
if (isset($_GET['step2'])) {
$_SESSION['step'] = 2;
}
// 根據 Session 狀態決定輸出
if (($_SESSION['step'] ?? 1) >= 2) {
// 步驟 2:只能前進,無法回步驟 1
echo '<h2>步驟 2:確認資料</h2>';
echo '<a href="step3.php">前往步驟 3</a>';
} else {
// 步驟 1:起始頁
echo '<h2>步驟 1:填寫資料</h2>';
echo '<a href="?step2=1">下一步</a>';
}
?>
<?php
session_start();
// 完成流程,清除狀態允許重新開始
unset($_SESSION['step']);
echo '<h2>步驟 3:完成</h2>';
echo '<p>流程結束,<a href="step12.php">重新開始</a></p>';
?>
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 驗證 CSRF Token
if (!hash_equals($_SESSION['csrf'] ?? '', $_POST['csrf'] ?? '')) {
die('無效請求');
}
// 處理業務邏輯...
// Post-Redirect-Get:導向結果頁
header('Location: result.php');
exit;
}
// 產生新 Token
$_SESSION['csrf'] = bin2hex(random_bytes(32));
?>
<form method="post">
<input type="hidden" name="csrf" value="<?= $_SESSION['csrf'] ?>">
<!-- 表單欄位 -->
<button type="submit">送出</button>
</form>
| 優點 | 缺點 |
|---|---|
| 伺服端控制,瀏覽器無關 | 需啟用 Cookie/Session |
| 邏輯集中,易維護 | 多頁籤操作可能衝突 |
| 可結合 CSRF 保護 | 需注意 Session 過期處理 |
建議:現代 SPA 架構建議前端路由控制導航,後端以 API 狀態驗證為主,此法適用於傳統多頁應用(MPA)。