if (!defined('IN_DISCUZ')) {
exit('Access Denied');
}
防止核心文件被直接訪問,確保只在框架上下文中加載。
通過位運算組合多種防禦策略:
HTTP_X_FORWARDED_FOR、HTTP_VIA 等頭)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 秒直接攔截。
if ($attackevasive & 2) {
if ($_SERVER['HTTP_X_FORWARDED_FOR'] || $_SERVER['HTTP_VIA'] || ...) {
securitymessage('attachsave_2_subject', 'attachsave_2_message', FALSE);
}
}
檢測常見代理頭,命中則提示「禁止代理訪問」。
if ($attackevasive & 4) {
if (empty($_DCOOKIE['lastrequest']) || $timestamp - $_DCOOKIE['lastrequest'] > 300) {
securitymessage('attachsave_4_subject', 'attachsave_4_message');
}
}
無 Cookie 或間隔超過 5 分鐘視為可疑重載,強制刷新頁面。
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,後續請求免驗證。
ajaxshowheader/footer)setTimeout(reload, 1001))或表單提交模式authcode() 防止客戶端篡改時間/答案。cache_secqaa.php,無需每次查庫。