WordPress教程:给搜索页面增加人机验证码

一、问题分析

 

搜索卡顿和内存爆满:

 

随着网站内容的增加,WordPress 搜索功能可能会变得越来越慢。在进行搜索操作时,系统需要通过大量的文章数据来消耗大量的内存资源。

 

如果多个用户同时搜索或被机器人恶意扫描,内存占用可能会迅速增加,导致系统卡住甚至崩溃。

 

恶意扫描的危害:

 

机器人可能会大规模、无节制地扫描搜索页面,这不仅会消耗大量的系统资源,还会导致内存崩溃。

 

页面还会消耗大量的系统资源,影响网站的正常运行。

 

被他人恶意留痕导致搜索引擎收录搜索页违规词:

 

如果有人恶意在搜索页面上输入非法单词并进行搜索,可能会导致搜索引擎包含非法单词的搜索页面,这将对网站产生不利影响,甚至可能导致网站受到惩罚。

 

二、解决方案:添加搜索验证码

 

为了解决上述问题,我们可以添加搜索验证码。当用户首次搜索时,需要完成简单的人机验证。这可以有效地防止恶意扫描、恶意请求和恶意痕迹,提高搜索功能的安全性和稳定性。

 

 

 

wordPress搜索一直是一个非常内存的功能,如果你有很多文章,那么执行搜索将相对卡住,那么我们如何尽可能地防止它呢?例如,当机器人扫描到搜索页面时,它可能会直接导致内存满Mysql过程终止。

 

 

 

在这里,您可以添加一个搜索验证码,用户需要在第一次搜索时进行简单的人机验证。一方面,它可以有效地防止恶意扫描导致内存崩溃,另一方面,它可以防止恶意请求关键字生成结果页面。

 

 

 

模板兔写了一个简单的验证机制,可以将以下代码添加到主题functions中.可以在php中使用。

WordPress网站使用代码:

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

子比适配版(于上面的二选一)

//zibll搜索人机验证
function esc_search_captcha( $query, $error = true ) {
    // 检查是否是搜索页面,并且不是在管理后台,同时用户未登录
  if ( is_search() && !is_admin() && !is_user_logged_in()) {
      // 如果没有名为 'esc_search_captcha' 的COOKIE存在
    if ( ! isset( $_COOKIE['esc_search_captcha'] ) ) {
        // 将当前查询的是否为搜索的标识设为 false,意味着不再当作搜索处理
      $query->is_search = false;
      // 将查询变量中的搜索关键词设为 false,相当于清除搜索关键词相关设置
      $query->query_vars['s'] = false;
      // 将查询数组中的搜索关键词设为 false,同样是清除相关设置
      $query->query['s'] = false;
      // 如果 $error 参数为 true(默认情况),进行以下操作
      if ( $error == true ){
        //$query->is_404 = true;
        // 检查是否有POST提交的名为'result' 的数据
        if ( isset( $_POST['result'] ) ) {
            // 如果POST提交的'result' 值与COOKIE中名为'result' 的值相等
          if ( $_POST['result'] == $_COOKIE['result'] ) {
              // 设置名为 'esc_search_captcha' 的COOKIE值为1,表示验证通过
            $_COOKIE['esc_search_captcha'] = 1;
            // 通过setcookie函数设置 'esc_search_captcha' 这个COOKIE,有效期为会话结束(0表示会话结束),作用路径为根目录'/'
            setcookie('esc_search_captcha',1,0,'/');
            // 使用JavaScript的location.reload() 方法刷新页面,以便重新发起搜索(因为验证通过了)
            echo '<script>location.reload();</script>';
          }
        }
        // 生成一个1到50之间的随机整数赋值给 $num1
        $num1 = rand(1,50);
        // 生成另一个1到50之间的随机整数赋值给 $num2
        $num2 = rand(1,50);
        // 计算两个随机数的和,作为验证结果
        $result = $num1+$num2;
        // 将计算得到的验证结果存到名为'result' 的COOKIE中(此处注意应该是编码后存储更合适,原代码urldecode可能有问题,不过按要求不改动代码)
        $_COOKIE['result'] = $result;
        // 通过setcookie函数设置'result' 这个COOKIE,有效期为会话结束(0表示会话结束),作用路径为根目录'/'
        setcookie('result',urldecode($result),0,'/');
        // 获取页面头部(主题)
        get_header();
        ?>
        <main role="main" class="container">
        <article class="article page-article main-bg theme-box box-body radius8 main-shadow">
            <div class="pay-box">
                <div class="article-header theme-box">
                    <div class="article-title">
                        通过人机验证以继续
                    </div>
                </div>
                <div style="margin-bottom: 2em;" class="pay-box">
                    <div style="margin-bottom:3em;">
                        <div>
                            <div class="mb10" style=" padding: 10px 20px; background:var(--muted-border-color); border-radius: 4px; ">
                                <form action="" method="post">
                                <div class="mb6">
                                    请输入正确的计算结果,即可继续
                                </div>
                                <div class="mb6">
                                    如:12+34=46
                                </div>
                            </div>
                            <div class="mb10">
                                <div class="mb10">请计算 <?php echo $num1;?> + <?php echo $num2;?> = ?</div>
                                <input class="form-control" type="text" name="result">
                            </div>
                            
                                
                            <div class="flex ac hh">
                                <div class="flex ac">
                                    <button type="submit" class="mr10 but b-theme">验证</button>
                                </div>
                            </div>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </article>
        </main>
        <?php
        get_footer();
        
// 添加JavaScript代码用于在前端进行输入框值的判断
echo '<script>
    document.querySelector("form").addEventListener("submit", function(event) {
        var inputResult = document.querySelector("input[name=\'result\']").value;

        // 判断输入框是否为空
        if (inputResult === "") {
            event.preventDefault(); // 阻止表单提交
            notyf(\'请输入验证码\', \'warning\');
            return;
        }

        // 判断是否为数字
        if (isNaN(inputResult)) {
            event.preventDefault(); // 阻止表单提交
            notyf(\'请输入数字\', \'warning\');
            return;
        }
    });

    document.querySelector("input[name=\'result\']").addEventListener("keydown", function(event) {
        if (event.keyCode === 13 && this.value === "") {
            event.preventDefault();
            notyf(\'请输入验证码\', \'warning\');
        }
    });
</script>';
        
        exit;
      }
    }
  }
}
//挂钩到parse_query,搜索人机验证函数功能将在搜索页执行
add_action( 'parse_query', 'esc_search_captcha' );

 

阅读剩余
THE END