为wordpress搜索增加验证,杜绝恶意搜索消耗服务器资源

wordpress搜索会增加服务器消耗,竞争对手会利用大量的无意义wordpress搜索来消耗尽你的服务器资源,让你原本轻松胜任的服务器配置,时刻处于卡爆状态。

在网络上找到一个为wordpress搜索增加验证码的代码,但这个代码是有问题的,也就是通过一次人机验证后,就不再验证下一次搜索请求了,这对于想要打击你站点的对手来说,太容易破解了。

所以在DeepSeek-R1满血版的帮助下,优化了这段代码,让它实现每次wordpress搜索都需要验证的功能。

具体的过程就不多说了,直接上代码:

function esc_search_captcha($query) {
    if (is_search() && !is_admin() && !is_user_logged_in()) {
        session_start(); // 使用服务端session替代cookie存储
        
        // 验证通过后跳过验证
        if (isset($_SESSION['search_verified']) && $_SESSION['search_verified'] === true) {
            unset($_SESSION['search_verified']); // 单次验证有效
            return;
        }

        // 处理表单提交
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['captcha_result'])) {
            if ((int)$_POST['captcha_result'] === $_SESSION['captcha_answer']) {
                $_SESSION['search_verified'] = true;
                wp_redirect(add_query_arg(null, null));
                exit;
            } else {
                $error_message = '验证码错误,请重试';
            }
        }

        // 生成新验证码
        $num1 = rand(10, 99);
        $num2 = rand(10, 99);
        $_SESSION['captcha_answer'] = $num1 + $num2;

        // 加载主题模板保持样式一致
        get_header();
        ?>
        <div class="search-captcha-wrapper">
            <h2>搜索验证</h2>
            <?php if (!empty($error_message)): ?>
                <p class="error"><?php echo $error_message; ?></p>
            <?php endif; ?>
            <form method="post">
                <div class="captcha-question">
                    请计算:<?php echo $num1; ?> + <?php echo $num2; ?> = ?
                </div>
                <input type="number" name="captcha_result" required 
                       placeholder="输入计算结果" class="captcha-input">
                <button type="submit" class="captcha-submit">提交验证</button>
            </form>
            <p class="notice">为防止机器人滥用,搜索前需完成验证</p>
        </div>
        <?php
        get_footer();
        exit;
    }
}
add_action('template_redirect', 'esc_search_captcha');

这段代码是放在functions.php里面,但不建议这样做。因为主题升级以后这段代码就没有了,而且如果放置的位置不对,还会让网站受影响。

所以推荐放在一个小插件里面,这个插件可以灵活启用,而且非常简单,这是云落大神写的,你也可以在里面加入其他代码,需要放在functions.php里面生效的代码都可以放在这里面生效。

<?php
/*
Plugin Name: 小插件
Description: 给主题添加点小功能
Author: 云落
*/
 

//搜索结果填加验证码
function esc_search_captcha($query) {
    if (is_search() && !is_admin() && !is_user_logged_in()) {
        session_start(); // 使用服务端session替代cookie存储
        
        // 验证通过后跳过验证
        if (isset($_SESSION['search_verified']) && $_SESSION['search_verified'] === true) {
            unset($_SESSION['search_verified']); // 单次验证有效
            return;
        }

        // 处理表单提交
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['captcha_result'])) {
            if ((int)$_POST['captcha_result'] === $_SESSION['captcha_answer']) {
                $_SESSION['search_verified'] = true;
                wp_redirect(add_query_arg(null, null));
                exit;
            } else {
                $error_message = '验证码错误,请重试';
            }
        }

        // 生成新验证码
        $num1 = rand(10, 99);
        $num2 = rand(10, 99);
        $_SESSION['captcha_answer'] = $num1 + $num2;

        // 加载主题模板保持样式一致
        get_header();
        ?>
        <div class="search-captcha-wrapper">
            <h2>搜索验证</h2>
            <?php if (!empty($error_message)): ?>
                <p class="error"><?php echo $error_message; ?></p>
            <?php endif; ?>
            <form method="post">
                <div class="captcha-question">
                    请计算:<?php echo $num1; ?> + <?php echo $num2; ?> = ?
                </div>
                <input type="number" name="captcha_result" required 
                       placeholder="输入计算结果" class="captcha-input">
                <button type="submit" class="captcha-submit">提交验证</button>
            </form>
            <p class="notice">为防止机器人滥用,搜索前需完成验证</p>
        </div>
        <?php
        get_footer();
        exit;
    }
}
add_action('template_redirect', 'esc_search_captcha');

?>

把它保存为php格式,打包成zip,在wordpress插件里面安装就行了。

© 版权声明
THE END
点赞21 分享
小花园 抢沙发

请登录后发表评论

    暂无评论内容