首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP 登出邏輯缺陷:isset($_POST['submit']) 導致 GET 請求被判定為非法訪問

     編輯:程式設計綜合問答

現象:登入後點擊「登出」連結(GET 請求 `index.php?action=logout`),頁面直接顯示「非法訪問」。

根因代碼

if (!isset($_POST['submit'])) { exit('非法訪問!'); }
// ... 登入邏輯 ...
if ($_GET['action'] == 'logout' && isset($_SESSION['user_id'])) { ... }

問題分析

修正方案(三選一)

方案一:增加操作類型判斷(最小改動)

$action = $_GET['action'] ?? ($_POST['action'] ?? 'login');

if ($action === 'login') {
    if (!isset($_POST['submit'])) exit('非法訪問!');
    // 登入邏輯
} elseif ($action === 'logout') {
    // 登出邏輯
}

方案二:分離腳本(推薦)

  • `login.php` 處理 POST 登入。
  • `logout.php` 處理 GET/POST 登出,銷毀 Session 後重定向。
  • `register.php` 處理註冊。

方案三:前端控制器模式(現代框架風格)

// index.php
require 'router.php';
$router->post('/login', 'AuthController@login');
$router->get('/logout', 'AuthController@logout');
$router->dispatch();

安全補充

  • 登出應使用 **POST** 表單(防 CSRF),而非 GET 連結:
<form action="logout.php" method="post">
  <button type="submit">登出</button>
</form>
  • 登入驗證務必使用 **預處理語句** 防 SQL 注入:
$stmt = $pdo->prepare("SELECT * FROM users WHERE user_email=? AND user_pass=?");
$stmt->execute([$email, $pass]); // 密碼應存 hash,而非明文
  • Session 啟動放在腳本最頂端 `session_start();`,勿放在判斷分支內。

重構單一腳本雜湊邏輯為分離的路由/控制器,是從「能跑」走向「可維護、安全」的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved