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

Discuz! security.inc.php 核心防禦機制深度剖析:從頻率控制到代理檢測

     編輯:PHP 綜合知識

文件入口與常量保護

if (!defined('IN_DISCUZ')) {
    exit('Access Denied');
}

防止核心文件被直接訪問,確保只在框架上下文中加載。

核心防禦邏輯:$attackevasive 位掩碼

通過位運算組合多種防禦策略:

  • Bit 1 (值 1):Cookie 刷新頻率限制(間隔 < 1 秒攔截)
  • Bit 2 (值 2):代理/IP 隱匿檢測(檢測 HTTP_X_FORWARDED_FOR、HTTP_VIA 等頭)
  • Bit 4 (值 4):二次請求/頁面重載檢測(間隔 > 300 秒視為異常)
  • Bit 8 (值 8):安全問答驗證(基於 Cookie 的挑戰-響應機制)

詳細邏輯流程

1. 頻率限制(Bit 1)

if ($attackevasive & 1) {
    $_DCOOKIE['lastrequest'] = authcode($_DCOOKIE['lastrequest'], 'DECODE');
    dsetcookie('lastrequest', authcode($timestamp, 'ENCODE'), $timestamp + 816400, 1, true);
    if ($timestamp - $_DCOOKIE['lastrequest'] < 1) {
        securitymessage('attachsave_1_subject', 'attachsave_1_message');
    }
}

解碼上次請求時間,編碼寫入當前時間,若間隔小於 1 秒直接攔截。

2. 代理檢測(Bit 2)

if ($attackevasive & 2) {
    if ($_SERVER['HTTP_X_FORWARDED_FOR'] || $_SERVER['HTTP_VIA'] || ...) {
        securitymessage('attachsave_2_subject', 'attachsave_2_message', FALSE);
    }
}

檢測常見代理頭,命中則提示「禁止代理訪問」。

3. 二次請求檢測(Bit 4)

if ($attackevasive & 4) {
    if (empty($_DCOOKIE['lastrequest']) || $timestamp - $_DCOOKIE['lastrequest'] > 300) {
        securitymessage('attachsave_4_subject', 'attachsave_4_message');
    }
}

無 Cookie 或間隔超過 5 分鐘視為可疑重載,強制刷新頁面。

4. 安全問答(Bit 8)

if ($attackevasive & 8) {
    list($qkey, $qans, $qtime) = explode('|', authcode($_DCOOKIE['secqcode'], 'DECODE'));
    include_once DISCUZ_ROOT.'./forumdata/cache/cache_secqaa.php';
    if (!$qans || !$qtime || $_DCACHE['secqaa'][$qkey]['answer'] != $qans) {
        if (empty($_POST['secqsubmit']) || $_DCACHE['secqaa'][$qkey]['answer'] != md5($_POST['answer'])) {
            $qkey = array_rand($_DCACHE['secqaa']);
            dsetcookie('secqcode', authcode($qkey.'||'.$timestamp, 'ENCODE'), ...);
            securitymessage($question, '<input name="answer"><input name="secqsubmit">', FALSE, TRUE);
        } else {
            dsetcookie('secqcode', authcode($qkey.'|'.$answer.'|'.$timestamp, 'ENCODE'), ...);
        }
    }
}

機制:隨機抽題 → Cookie 存儲題目鍵+時間 → 用戶提交答案 → MD5 驗證 → 通過則寫入答案 Cookie,後續請求免驗證。

統一輸出處理:securitymessage()

  • AJAX 請求:輸出 XML 格式彈窗內容(ajaxshowheader/footer)
  • 普通請求:輸出完整 HTML 頁面,可選自動重載(setTimeout(reload, 1001))或表單提交模式
  • 多語言支持:內建中文提示語陣列,鍵名對應上述四類攔截場景

安全設計亮點

  1. 多層次防禦:頻率、代理、重載、人機驗證四維組合,可靈活開關。
  2. Cookie 加密簽名:authcode() 防止客戶端篡改時間/答案。
  3. 靜默降級:AJAX 與普通請求分離處理,不破壞前端交互體驗。
  4. 緩存題庫:題目答案預載入 cache_secqaa.php,無需每次查庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved