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' );
阅读剩余
版权声明:
作者:chanlicheng
链接:https://clcxz.cn/archives/2463
文章版权归作者所有,未经允许请勿转载。
THE END