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');
实现方案说明
-
验证机制优化
- 改用服务端Session存储验证答案(
$_SESSION
) - 验证结果单次有效,避免重复使用
- 使用更复杂的两位数计算题(10+10到99+99)
- 改用服务端Session存储验证答案(
-
安全性增强
- 验证失败时显示错误提示
- 对用户输入进行强制类型转换(
(int)
) - 仅对未登录用户启用验证(
!is_user_logged_in()
) - 使用POST方法提交表单
-
用户体验改进
- 集成主题模板(
get_header()
/get_footer()
) - 添加友好的错误提示和说明文案
- 使用number类型输入框增强移动端体验
- 集成主题模板(
-
代码结构优化
- 改用
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;
}
扩展建议
-
增强验证方式
// 在生成验证码时添加更多题型 $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; }
- 频率限制
// 在函数开头添加频率检查 if (isset($_SESSION['search_attempts'])) { if ($_SESSION['search_attempts'] > 3) { wp_die('尝试次数过多,请1小时后再试'); } } else { $_SESSION['search_attempts'] = 0; } // 在验证失败时增加计数器 $_SESSION['search_attempts']++;
- 集成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']) { // 验证失败处理 } }
注意事项
-
Session管理
- 确保服务器已正确配置Session
- 在
wp-config.php
中添加:if (!session_id()) session_start();
-
缓存兼容
- 禁用搜索页面的缓存
- 在验证页添加缓存控制头:
header('Cache-Control: no-store, no-cache, must-revalidate');
-
多语言支持
- 使用
__()
函数包裹文本字符串 - 创建翻译文件(.po/.mo)
- 使用
-
- 日志记录
// 记录验证失败尝试 if ($error_message) { error_log('Search captcha failed - IP: ' . $_SERVER['REMOTE_ADDR']); }
- 移动端优化
- 添加viewport meta标签
- 使用媒体查询适配小屏幕
- 增加触控区域尺寸
这个改进方案在保持核心功能的同时,增强了安全性和用户体验,建议根据实际需求选择功能组合。对于高安全要求的场景,推荐优先集成Google reCAPTCHA v3实现无感验证。
最后,是DeepSeek-R1满血版看到原始代码后,所进行的思路过程。
理解问题
深度思考完成 用时26秒
© 版权声明
文章版权归作者所有,未经允许请勿转载,图片部分引用于网络,非盈利未署名转载,如有著作权保护请留言站长修改。
THE END
请登录后查看评论内容