给 WordPress 搜索结果页前添加人机验证码

WordPress内置的搜索是一个很占内存的功能,如果你的文章很多,那么执行一次搜索会相对卡顿,那么我们如何尽可能的防范一下呢?比如机器人扫描到了搜索页面,那将可能直接导致内存爆满mysql进程被终止。

图片[1]-给 WordPress 搜索结果页前添加人机验证码-十一张

我们可以加一个简单的搜索验证机制,用户在第一次搜索时需要进行简单的人机验证。一来这样可以有效防止恶意扫描导致内存崩溃,二来可以防止恶意请求关键字生成结果页面。

可以将下面的代码(2选1)添加到主题的 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,'/');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>人机验证</title>
<style>
body {
background-color: #f5f5f5;
color: #333;
font-size: 16px;
font-family: Arial, sans-serif;
text-align: center;
line-height: 1.6;
}
.container {
margin: 50px auto 15px;
max-width: 400px;
padding: 40px 20px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
border-radius: 5px;
background-color: #fff;
}
h1 {
font-size: 24px;
font-weight: normal;
margin-top: 0;
}
form {
margin: 0;
}
.input-group {
display: flex;
align-items: center;
margin-bottom: 20px;
}
.label {
flex: 0 0 80px;
text-align: right;
margin-right: 20px;
}
.input {
flex: 1;
height: 40px;
border: none;
border-bottom: 1px solid #ccc;
padding: 0 10px;
font-size: 16px;
box-sizing: border-box;
}
.btn {
display: block;
width: 100%;
height: 40px;
line-height: 40px;
background-color: #ff5f33;
color: #fff;
font-size: 16px;
border: none;
border-radius: 5px;
cursor: pointer;
}
.btn:hover {
background-color: #ff7854;
}
.btn:focus {
outline: none;
}
a {
color: #666;
font-size: 14px;
text-decoration: none;
}
a:hover {
color: #333;
}
</style>
</head>
<body>
<div class="container">
<h1>人机验证</h1>
<form action="" method="post">
<div class="input-group">
<label class="label"><?php echo $num1;?> + <?php echo $num2;?> =</label>
<input type="text" name="result" class="input" required />
</div>
<button type="submit" class="btn">验证</button>
</form>
</div>
<a href="<?php echo home_url();?>" class="back-link">返回首页</a>
</body>
</html>
<?php
exit;
}
}
}
}
add_action( 'parse_query', 'esc_search_captcha' );
/*WordPress 纯代码添加搜索人机验证 结束*/
/*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 {
font-family: Arial, sans-serif;
background-color: #f5f5f5;
}
.erphp-search-captcha {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
max-width: 350px;
width: 100%;
padding: 30px;
border-radius: 5px;
background-color: #f8f8f8;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
font-size: 18px;
line-height: 1.5;
text-align: center;
}
.erphp-search-captcha form {
margin-top: 20px;
}
.erphp-search-captcha input {
display: inline-block;
width: 60px;
height: 40px;
margin-right: 10px;
font-size: 20px;
text-align: center;
border: 2px solid #ddd;
border-radius: 3px;
transition: border-color 0.2s;
}
.erphp-search-captcha input:focus {
outline: none;
border-color: #ff5f33;
}
.erphp-search-captcha button {
display: inline-block;
padding: 0 20px;
height: 40px;
line-height: 40px;
font-size: 18px;
font-weight: bold;
color: #fff;
background-color: #ff5f33;
border: none;
border-radius: 3px;
cursor: pointer;
transition: background-color 0.2s;
}
.erphp-search-captcha button:hover {
background-color: #d44c2e;
}
.erphp-search-captcha button:focus {
outline: none;
}
.erphp-search-captcha a {
display: block;
margin-top: 20px;
color: #666;
font-size: 14px;
text-decoration: none;
transition: color 0.2s;
}
.erphp-search-captcha a:hover {
color: #333;
}
</style>
</head>
<body>
<div class="erphp-search-captcha">
<p>为了防止搜索机器人,需要进行人机验证。</p>
<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' );
/*WordPress 纯代码添加搜索人机验证 结束*/

PS:使用 ZiBll 子比主题的朋友,为了防止在线更新主题的时候,functions.php 文件的内容被覆盖,也可以将上面的代码改成放到 /wp-content/themes/zibll/func.php 文件中。

代码1 样式:

图片[2]-给 WordPress 搜索结果页前添加人机验证码-十一张

代码2 样式:

图片[3]-给 WordPress 搜索结果页前添加人机验证码-十一张

上面这段代码的作用是在 WordPress 的搜索功能中添加人机验证,在用户进行搜索时,如果没有通过人机验证,则不允许进行搜索,需要用户重新输入正确的结果才能进行搜索。界面使用了灰色背景和简洁的样式,更加美观大方。

具体原理就是通过拦截 WordPress 的查询操作,判断是否为搜索操作,如果是则进行人机验证。当验证通过,则设置一个Cookie,以后再进行搜索时就不需要再进行验证了。如果验证未通过,则输出人机验证的界面,要求用户输入正确的计算结果才能进行搜索。

✅来源:十一张博客
© 版权声明
THE END
如果觉得这篇文章对您有帮助,可以收藏本网址,方便下次访问!
点赞1 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容