惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
F
Fortinet All Blogs
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
罗磊的独立博客
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
U
Unit 42
N
Netflix TechBlog - Medium
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
Stack Overflow Blog
Stack Overflow Blog
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Proofpoint News Feed
G
Google Developers Blog
H
Help Net Security

缙哥哥

公共空间里的 酷鸭数据8H16G香港服务器使用一周年,续期一年继续使用 「秘塔回响」纯粹的 Windows 语音 AI 输入法,仅7M大小 WorkBuddy混元Hy3月底限免结束,用GLM送的2亿Token平替 如何隐藏 EdgeEver 默认账号或显示实际使用账号 书生大模型每月赠送9000万Tokens算力,适用于长文本和信息整合 Linux 服务器一键 DD 脚本安装各种 Windows 10 系统教程 限免:正版 IObit Advanced SystemCare Pro 系统优化 智谱GLM模型免费2000万Tokens算力,最高每月可得2亿 使用 CloudFlare 安全规则对 EdgeEver 登录接口进行防护 一分钟部署零成本、开源且原生支持 AI Agent 个人笔记 EdgeEver Filebase 免费S3对象存储,免费5G空间,月5G流量,无需绑卡 吾爱破解论坛2026年7月21日,暑假免费开放注册 Lightlayer 圣何塞1核1G服务器千兆优化线路仅需4.9刀/月 Ubuntu 如何查看系统版本,如何将系统升级到最新版本 Epic 限时免费领取 $5.99 成人游戏《请做coser的主人5》 户外活动时给妹子解决腰腿问题,妹子送我三个包 零基础部署私人AI:云服务器部署Ollama和AI大模型 缙哥哥分享微软 Windows 常用运行库下载汇总[更新至2026.06] 国内网络复杂的让我仿佛回到了ADSL拨号上网时代 腾讯准备上线新的网盘项目——腾讯网盘,你会去用吗? 分享一款免费的记忆力训练APP程序——记忆宫殿 阿里云域名 DNS 免费版日解析量限额10万次 最近听到张含韵两首歌曲,让人回忆青春又有激情,附壁纸美照 【5月更新】每月送258天网易云音乐黑胶VIP会员,先到先得! 阿里云盘26年5月最新扩容福利码分享 京东健康邀请3个新用户,轻松1分钱领取天晟体脂称 4月28日起《暗黑破坏神®IV》- 基础版免费领取永久畅玩 迅雷旗下光鸭云盘正式上线,免费用户2T空间可做同步备份 第七波:赠送一年正版IObit Driver Booster Pro驱动安装神器激活码
关于 WordPress 恶意搜索的防御思路:限制搜索内容
缙哥哥 · 2026-07-05 · via 缙哥哥

刚才访问博客又出现了 502 超时的错误提示,进后台一看卡的要死,CPU 和内存都爆满,看了下网站日志,原来是有人恶意搜索。无论是想利用搜索提交到搜索引擎还是什么原因,都导致了站点服务器资源的大量占用……看了一下 IP 地域,有全国各地的请求,并且绕过了我在 CDN 中的/?s=的人机匹配规则,那么我就在此基础上,再增加一部分防御,供小伙伴们参考。

相关阅读

考虑到这些恶意搜索的内容都比较长,而我们真实搜索往往字数很少,所以进行了限制搜索内容的长度,同时现在某些人为了绕过某些恶意关键词匹配,又会在词语中加特殊符号对关键词进行分隔,所以将特殊符号也进行拦截。我又将 WordPress 评论里的关键词黑名单词汇进行调用,单反搜索的时候匹配到这些恶意关键词,就返回 404;考虑到每次搜索都要进行关键词匹配,我又使用了 WordPress 自带的对象缓存(Object Cache)解决这个问题,避免 CPU 和数据库的打量占用。

这里还是利用functions.php函数去实现功能

/**
 * 限制搜索关键词:拦截特殊符号 + 限制中英文长度 + 拦截评论黑名单(内存缓存优化版)
 */
function limit_search_query_length() {
    if ( ! is_search() ) {
        return;
    }

    $search_query = get_search_query();
    if ( empty( $search_query ) ) {
        return;
    }

    $has_special_chars = preg_match('/[^\x{4e00}-\x{9fa5}a-zA-Z0-9\s]/u', $search_query);

    $chinese_char_count = preg_match_all('/[\x{4e00}-\x{9fa5}]/u', $search_query);
    $english_char_count = preg_match_all('/[a-zA-Z]/', $search_query);
    $total_length = $chinese_char_count + $english_char_count;

    $max_chinese_chars = 6;    // 中文最大字数限制
    $max_mixed_length = 15;     // 中英文混合最大总长度限制

    $has_blacklist_word = false;
    $blacklist_array = wp_cache_get( 'search_blacklist_array', 'options' );

    if ( $blacklist_array === false ) {
        $blacklist = get_option( 'disallowed_keys' );
        if ( empty( $blacklist ) ) {
            $blacklist = get_option( 'blacklist_keys' );
        }

        if ( ! empty( $blacklist ) ) {
            $blacklist_array = array_filter( array_map( 'trim', explode( "\n", $blacklist ) ) );
        } else {
            $blacklist_array = array();
        }

        wp_cache_set( 'search_blacklist_array', $blacklist_array, 'options' );
    }

    if ( ! empty( $blacklist_array ) ) {
        $pattern = '/' . implode( '|', array_map( 'preg_quote', $blacklist_array ) ) . '/iu';
        if ( preg_match( $pattern, $search_query ) ) {
            $has_blacklist_word = true;
        }
    }

    if ( $has_special_chars || $chinese_char_count > $max_chinese_chars || $total_length > $max_mixed_length || $has_blacklist_word ) {
        global $wp_query;
        $wp_query->set_404();
        status_header( 404 );
        get_template_part( 404 );
        exit();
    }
}
add_action( 'template_redirect', 'limit_search_query_length' );

结语

在构思上,构建了三道坚固的防线。

  • 首先,它采用严格的“白名单机制”,仅允许用户输入中文、英文、数字和空格,任何包含特殊符号的请求都会被直接拦截。
  • 其次,它支持灵活的字数限制,能够独立限制中文字数(如 6 个字)和中英文混合总长度(如 15 个字),有效阻断长串无意义字符的堆砌。
  • 最重要的是,我调用了 WordPress 后台的“评论黑名单(disallowed_keys)”作为搜索屏蔽词库,实现了一处配置、全局生效的便捷管理。

在性能优化方面,缙哥哥放弃了传统黑名单匹配带来的数据库和 CPU 负担,它利用了 WordPress 内置的内存缓存 API(wp_cache),将黑名单数据在首次请求时解析并缓存于内存中,避免了重复的数据库查询与字符串分割操作。同时,代码摒弃了低效的循环遍历,采用正则表达式(preg_match)进行批量匹配,借助底层 C 语言引擎实现毫秒级的词汇扫描。此外,代码还加入了短路机制,一旦命中拦截条件便立即终止后续计算。

那么结合缙哥哥之前 CDN 里的搜索请求的人机验证匹配,应该能一定程度上缓解恶意搜索带来的问题,希望我的思路能为你所用!