首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 利用 Session 防止頁面重複提交與惡意刷新

     編輯:PHP 相關知識

表單重複提交會導致資料重複寫入、扣款多次等嚴重問題。本文示範以 Session 結合 IP 與表單參數生成唯一標識,限制同一用戶在指定時間內無法重複請求同一業務邏輯。

核心防禦邏輯

session_start();
$fs1 = $_POST['a'];
$fs2 = $_POST['b'];
$allowTime = 30; // 秒
$reip = GetIP(); // 取得真實 IP
$allowT = md5($reip . $fs1 . $fs2);

if (!isset($_SESSION[$allowT])) {
    $_SESSION[$allowT] = time();
} elseif (time() - $_SESSION[$allowT] >= $allowTime) {
    $_SESSION[$allowT] = time();
} else {
    header('HTTP/1.1 404 Not Found');
    die('來自 ' . $ip . ' 的用戶,您刷新過快了');
}

關鍵點解析

  • 僅允許 POST 請求:直接訪問 URL 返回 404,防止 GET 刷新。
  • 複合鍵值設計:md5(IP + 表單參數) 區分不同業務提交,避免同一 IP 不同表單互相干擾。
  • 時間窗口控制:Session 記錄上次成功請求時間,間隔不足 $allowTime 秒直接拒絕。
  • 真實 IP 獲取:支援代理頭 HTTP_X_FORWARDED_FOR、HTTP_CLIENT_IP 等多層代理環境。

前端配合範例

<form action="b.php" method="post">
    <input type="hidden" name="a" value="a"/>
    <input type="hidden" name="b" value="b"/>
    <button type="submit">提交</button>
</form>

進階防護建議

  • 加入 Referer 檢查防範跨站提交(CSRF),但需注意瀏覽器兼容性。
  • 關鍵業務(下單、支付)應改用 Token 機制:表單隱藏字段攜帶一次性 Token,服務端驗證後銷毀。
  • 高併發場景建議使用 Redis 以原子操作 SETNX key EX 30 替代 Session,避免檔案鎖競爭。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved