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

ThinkPHP 實現 404 錯誤頁面與存取安全防護

     編輯:PHP 綜合知識

專業網站需提供友善的 404 頁面,既提升使用者體驗,又有利 SEO。ThinkPHP 利用「空控制器(EmptyAction)」與「空方法(_empty)」機制,可輕鬆實現全站 404 攔截。本文並補充存取安全防護建議。

步驟一:建立空控制器

檔案:Lib/Action/EmptyAction.class.php

<?php
class EmptyAction extends Action {
    // 空方法:訪問不存在的控制器時觸發
    public function _empty() {
        header("HTTP/1.0 404 Not Found");
        $this->display('empty:index');
    }

    // 空控制器下的 index 方法(直接訪問空控制器時)
    public function index() {
        header("HTTP/1.0 404 Not Found");
        $this->display('empty:index');
    }
}
?>

步驟二:所有控制器加入 _empty 方法

在每個控制器(或公共基底類 CommonAction)中加入:

public function _empty() {
    header("HTTP/1.0 404 Not Found");
    $this->display('empty:index');
}

當訪問存在的控制器但不存在的方法時,將觸發此 _empty()。

步驟三:建立 404 模板

目錄:Tpl/empty/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>404 - 頁面不存在</title>
    <style>body{text-align:center;padding:50px;font-family:Microsoft YaHei;}</style>
</head>
<body>
    <h1>404</h1>
    <p>您訪問的頁面不存在或已被移除。</p>
    <a href="__APP__/">返回首頁</a>
</body>
</html>

進階:統一繼承基底類別實現安全防護

若攻擊者猜測使用 ThinkPHP,可能嘗試直接訪問 /Public/、/Runtime/ 等敏感路徑。建議:

  1. 建立 Lib/Action/SecureAction.class.php 作為所有控制器基底。
  2. 在 _initialize() 中攔截可疑請求(如路徑含 ..、Runtime、Conf 等關鍵字)。
  3. 所有控制器繼承 SecureAction,EmptyAction 亦繼承之。
class SecureAction extends Action {
    public function _initialize() {
        $url = $_SERVER['REQUEST_URI'];
        $blacklist = array('Runtime', 'Conf', 'Lang', '.svn', '.git', '..');
        foreach ($blacklist as $keyword) {
            if (stripos($url, $keyword) !== false) {
                header("HTTP/1.0 404 Not Found");
                exit('Access Denied');
            }
        }
    }
    
    public function _empty() {
        header("HTTP/1.0 404 Not Found");
        $this->display('empty:index');
    }
}

其他安全建議

  • 關閉 APP_DEBUG 於生產環境。
  • 設定 open_basedir 限制 PHP 存取目錄。
  • 資料庫配置檔置於 Web 根目錄外。
  • 定期更新 ThinkPHP 核心至最新安全版本。

原文出處:尛雷博客

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