利用DeepSeek-R1满血版优化代码,实现wordpress搜索人机验证

图片[1]-利用DeepSeek-R1满血版优化代码,实现wordpress搜索人机验证-墨铺

wordpress搜索需要挺多的服务器资源支持,就算你的服务器主机性能不错,你的竞争对手甚至不用别的攻击手段,只利用机器软件高频发送大量搜索请求,就能达到让你的服务器卡爆效果,而且wordpress搜索功能也能为一些非法词打广告,让搜索引擎检索到那些非法广告词,从而让你惹上不必要的麻烦。

今天在网络上找到一个为wordpress搜索增加人机验证的代码,是添加在主题functions.php文件里面就能生效的,试用后发现确实能用,但它也有一个极大缺陷,也就是人机验证是一次性的,通过后就不再需要验证了,这也意味着你的竞争对手只需要手动通过一次验证后就可以不停的发送搜索请求来打击你的服务器了。

好在世间已经出现了DeepSeek-R1满血版,好在我小脑瓜灵机一动,于是就让DeepSeek-R1满血版给我优化了代码,实现了让每一次搜索都需要验证的功能。

下面不多说,直接让原始代码:

function esc_search_captcha( $query, $error = true ) {

if ( is_search() && !is_admin() ) {

if ( ! isset( $_COOKIE['esc_search_captcha'] ) ) {

$query->is_search = false;

$query->query_vars['s'] = false;

$query->query['s'] = false;

if ( $error == true ){

//$query->is_404 = true;

if ( isset( $_POST['result'] ) ) {

if ( $_POST['result'] == $_COOKIE['result'] ) {

$_COOKIE['esc_search_captcha'] = 1;

setcookie('esc_search_captcha',1,0,'/');

echo '<script>location.reload();</script>';

}

}

$num1 = rand(1,50);

$num2 = rand(1,50);

$result = $num1+$num2;

$_COOKIE['result'] = $result;

setcookie('result',urldecode($result),0,'/');

?>

<html>

<head>

<meta charset="UTF-8">

<title>人机验证</title>

<style>

body{color: #333;text-align: center;font-size: 16px;}

.erphp-search-captcha{margin: 50px auto 15px;max-width: 250px;width: 100%;padding: 40px 20px;border: 1px solid #ddd;text-align: center;border-radius: 5px;}

.erphp-search-captcha form{margin: 0}

.erphp-search-captcha input{border: none;border-bottom: 1px solid #666;width: 50px;text-align: center;font-size: 16px;}

.erphp-search-captcha input:focus{outline: none;}

.erphp-search-captcha button{border: none;background: transparent;color: #ff5f33;cursor: pointer;}

.erphp-search-captcha button:focus{outline: none;}

a{color: #000;font-size: 12px;}

</style>

</head>

<body>

<div class="erphp-search-captcha">

<form action="" method="post"><?php echo $num1;?> + <?php echo $num2;?> = <input type="text" name="result" required /> <button type="submit">验证</button></form>

</div>

<a href="<?php echo home_url();?>">返回首页</a>

</body>

</html>

<?php

exit;

}

}

}

}

add_action( 'parse_query', 'esc_search_captcha' );

经过DeepSeek-R1满血版优化后的代码如下:

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');

实现方案说明

  1. 验证机制优化

    • 改用服务端Session存储验证答案($_SESSION
    • 验证结果单次有效,避免重复使用
    • 使用更复杂的两位数计算题(10+10到99+99)
  2. 安全性增强

    • 验证失败时显示错误提示
    • 对用户输入进行强制类型转换((int)
    • 仅对未登录用户启用验证(!is_user_logged_in()
    • 使用POST方法提交表单
  3. 用户体验改进

    • 集成主题模板(get_header()/get_footer()
    • 添加友好的错误提示和说明文案
    • 使用number类型输入框增强移动端体验
  4. 代码结构优化

    • 改用template_redirect钩子
    • 合理使用重定向(wp_redirect()
    • 分离验证逻辑与显示逻辑

上面的代码已经可以用了,但AI给出了更多的优化方案,我并没有使用,因为比较复杂,如你对代码比较了解,可以采用。

配套样式建议 (CSS)

.search-captcha-wrapper {
    max-width: 600px;
    margin: 2rem auto;
    padding: 2rem;
    background: #fff;
    border-radius: 8px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}

.captcha-question {
    font-size: 1.5rem;
    margin: 1.5rem 0;
    color: #333;
}

.captcha-input {
    width: 150px;
    padding: 0.5rem;
    border: 2px solid #007cba;
    border-radius: 4px;
    font-size: 1.2rem;
    text-align: center;
}

.captcha-submit {
    background: #007cba;
    color: white;
    padding: 0.5rem 1.5rem;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    transition: opacity 0.3s;
}

.captcha-submit:hover {
    opacity: 0.9;
}

.error {
    color: #dc3232;
    font-weight: bold;
}

.notice {
    color: #666;
    font-size: 0.9rem;
    margin-top: 1rem;
}

扩展建议

  1. 增强验证方式

    // 在生成验证码时添加更多题型
    $types = ['addition', 'subtraction', 'simple_word'];
    $selected_type = $types[array_rand($types)];
    
    switch ($selected_type) {
        case 'addition':
            $num1 = rand(10, 99);
            $num2 = rand(10, 99);
            $_SESSION['captcha_answer'] = $num1 + $num2;
            $question = "$num1 + $num2 = ?";
            break;
        case 'subtraction':
            $num1 = rand(100, 200);
            $num2 = rand(10, 99);
            $_SESSION['captcha_answer'] = $num1 - $num2;
            $question = "$num1 - $num2 = ?";
            break;
        case 'simple_word':
            $words = ['苹果', '香蕉', '太阳', '月亮'];
            $answer = array_rand($words);
            $_SESSION['captcha_answer'] = $words[$answer];
            $question = "第三个字是?:" . implode(' ', $words);
            break;
    }

  2. 频率限制
    // 在函数开头添加频率检查
    if (isset($_SESSION['search_attempts'])) {
        if ($_SESSION['search_attempts'] > 3) {
            wp_die('尝试次数过多,请1小时后再试');
        }
    } else {
        $_SESSION['search_attempts'] = 0;
    }
    
    // 在验证失败时增加计数器
    $_SESSION['search_attempts']++;

     

  3. 集成reCAPTCHA
    // 在验证逻辑中添加
    if (isset($_POST['g-recaptcha-response'])) {
        $response = wp_remote_post('https://www.google.com/recaptcha/api/siteverify', [
            'body' => [
                'secret'   => 'your_secret_key',
                'response' => $_POST['g-recaptcha-response'],
                'remoteip' => $_SERVER['REMOTE_ADDR']
            ]
        ]);
    
        $result = json_decode($response['body'], true);
        if (!$result['success']) {
            // 验证失败处理
        }
    }

    注意事项

    1. Session管理

      • 确保服务器已正确配置Session
      • wp-config.php中添加:if (!session_id()) session_start();
    2. 缓存兼容

      • 禁用搜索页面的缓存
      • 在验证页添加缓存控制头:header('Cache-Control: no-store, no-cache, must-revalidate');
    3. 多语言支持

      • 使用__()函数包裹文本字符串
      • 创建翻译文件(.po/.mo)
  4.  日志记录
    // 记录验证失败尝试
    if ($error_message) {
        error_log('Search captcha failed - IP: ' . $_SERVER['REMOTE_ADDR']);
    }

     

  5. 移动端优化
  • 添加viewport meta标签
  • 使用媒体查询适配小屏幕
  • 增加触控区域尺寸

这个改进方案在保持核心功能的同时,增强了安全性和用户体验,建议根据实际需求选择功能组合。对于高安全要求的场景,推荐优先集成Google reCAPTCHA v3实现无感验证。

最后,是DeepSeek-R1满血版看到原始代码后,所进行的思路过程。

理解问题
深度思考完成 用时26秒

嗯,用户想在WordPress的搜索结果页面添加人机验证码,这段代码看起来是一个初步的实现方案。让我仔细看看这个函数的结构和逻辑。

首先,函数esc_search_captcha被挂载到parse_query这个钩子上,这意味着每次处理查询时都会执行这个函数。函数内部检查是否在搜索页面且非后台,然后检查是否存在esc_search_captcha的cookie。如果不存在,就进行验证码的处理。

看起来用户使用了简单的数学问题作为验证方式,生成两个随机数相加,并将结果存储在cookie中。当用户提交表单时,检查用户输入的结果是否与cookie中的一致。如果正确,就设置esc_search_captcha的cookie,然后刷新页面。否则,可能显示错误或者重新显示验证码。

不过,有几个潜在的问题需要指出。首先,直接操作$query对象来禁用搜索可能不够可靠,特别是设置is_search和s参数为false。其次,使用cookie存储验证结果可能存在安全隐患,因为用户可以篡改cookie。另外,直接在PHP中输出HTML并exit可能会干扰WordPress的正常流程,导致主题或插件未正确加载,样式可能不一致。

另外,代码中的setcookie函数是否正确使用?因为COOKIE是超全局变量,直接修改它可能不会立即生效,因为cookie是在响应头中设置的,而_COOKIE是在请求头中解析的。所以用户提交后,通过设置$_COOKIE[‘esc_search_captcha’]可能无法立即生效,需要刷新页面才能看到效果,而代码里用了location.reload(),这可能会导致重复验证的问题。

还有,表单的action属性为空,这意味着表单提交到当前URL,但如果是GET请求的搜索页面,可能会被重定向或者其他处理干扰。此外,没有对非POST请求的处理,可能导致验证码页面在刷新时重复出现。

安全性方面,验证码的结果存储在客户端cookie中,容易被恶意用户查看或修改,应该考虑将结果存储在服务器端,比如使用session或者 transient API。此外,数学问题的难度可能不够高,可能被自动化脚本破解,可以考虑更复杂的验证码形式,如reCAPTCHA等。

用户体验方面,直接exit会停止WordPress的进一步处理,导致主题的header和footer不加载,页面样式可能不统一。应该整合到主题的模板文件中,或者使用WordPress的钩子来正确输出内容,同时保持一致的样式。

另外,代码中的urldecode($result)似乎没有必要,因为结果是一个整数,直接存储即可。而且,设置cookie的过期时间为0,这意味着浏览器关闭后cookie会失效,可能需要更长的有效期,或者在验证成功后设置合理的过期时间。

最后,错误处理部分被注释掉的$query->is_404 = true;可能需要重新考虑,如果验证失败是否应该显示404页面,还是显示错误信息给用户。目前的实现中,如果验证失败,用户可能需要重新提交表单,但页面会重新加载,可能需要更明确的错误提示。

总结来说,这段代码实现了基本功能,但存在安全漏洞、用户体验问题和可能的逻辑错误。建议改进存储验证结果的方式,使用服务器端存储,增强验证码的复杂性,整合到主题模板中以保持样式一致,并处理表单提交后的正确重定向和反馈。

© 版权声明
THE END
喜欢请点赞支持!
点赞5 分享
大话西游 抢沙发

请登录后发表评论

    请登录后查看评论内容