
在某些特定场景下,网站运营者可能需要对所有访问者强制实施一道安全屏障,例如在访问网站内容之前要求完成CAPTCHA验证。这种需求通常伴随着以下特点:
传统的WordPress CAPTCHA插件通常针对表单(如登录、评论)设计,难以实现全站强制且带有时效性的验证逻辑。直接在主题文件(如header.php)中插入简单代码也可能因加载顺序或缺乏复杂逻辑而失败。因此,我们需要一种更灵活、更底层的自定义实现方式。
我们将采用Google reCAPTCHA v2作为验证机制,并通过自定义HTML、CSS和JavaScript来构建一个覆盖整个页面的验证层。当访客首次访问或验证过期时,此层将显示reCAPTCHA,成功验证后隐藏并设置一个计时器(通过Cookie或LocalStorage实现)。
首先,您需要在Google reCAPTCHA官方网站注册您的网站,并获取reCAPTCHA v2的网站密钥(Site Key)和秘密密钥(Secret Key)。
为了实现全站覆盖和定时重验,我们需要在页面加载时注入特定的HTML、CSS和JavaScript。
在您的WordPress主题文件(推荐使用子主题,或通过钩子注入)的<body>标签内,尽早地添加以下HTML结构。这个captcha-overlay将覆盖整个页面,g-recaptcha是reCAPTCHA小部件的渲染容器。
<div id="captcha-overlay">
<div class="captcha-container">
<h2>请先完成安全验证</h2>
<div id="g-recaptcha-widget" class="g-recaptcha" data-sitekey="您的网站密钥" data-callback="onCaptchaSuccess"></div>
<p class="captcha-message" style="display:none; color: red;">验证失败,请重试。</p>
</div>
</div>注意:将您的网站密钥替换为您实际获取的Site Key。data-callback="onCaptchaSuccess"指定了验证成功后要调用的JavaScript函数。
添加以下CSS样式,确保captcha-overlay能够覆盖整个页面,并且captcha-container居中显示。您可以将这些CSS添加到主题的style.css文件,或通过WordPress的wp_head或wp_footer钩子注入。
#captcha-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.8); /* 半透明黑色背景 */
display: flex;
justify-content: center;
align-items: center;
z-index: 99999; /* 确保在最上层 */
}
.captcha-container {
background-color: #fff;
padding: 30px;
border-radius: 8px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
text-align: center;
max-width: 400px;
width: 90%;
}
.captcha-container h2 {
margin-top: 0;
color: #333;
}这是核心逻辑部分,包含reCAPTCHA的异步加载、渲染以及验证成功后的处理(隐藏覆盖层和设置定时Cookie)。
<script>
// reCAPTCHA异步加载安全处理:确保grecaptcha.ready()可以安全调用
// 无论reCAPTCHA API是否已完全加载。
if(typeof grecaptcha === 'undefined') {
grecaptcha = {};
}
grecaptcha.ready = function(cb){
if(typeof grecaptcha === 'undefined') {
const c = '___grecaptcha_cfg';
window[c] = window[c] || {};
(window[c]['fns'] = window[c]['fns']||[]).push(cb);
} else {
cb();
}
}
const CAPTCHA_EXPIRATION_KEY = 'captcha_verified_until';
const CAPTCHA_EXPIRATION_HOURS = 6; // 验证有效期(小时)
// 检查是否需要显示CAPTCHA
function checkCaptchaStatus() {
const verifiedUntil = localStorage.getItem(CAPTCHA_EXPIRATION_KEY);
if (verifiedUntil && new Date().getTime() < parseInt(verifiedUntil)) {
// CAPTCHA仍在有效期内,直接隐藏覆盖层
document.getElementById('captcha-overlay').style.display = 'none';
return true;
}
// 需要显示CAPTCHA
document.getElementById('captcha-overlay').style.display = 'flex';
return false;
}
// reCAPTCHA验证成功后的回调函数
function onCaptchaSuccess(token) {
// 在这里进行服务器端验证(非常重要!)
// 实际应用中,您需要将token发送到您的服务器进行验证。
// 示例:
// fetch('/wp-admin/admin-ajax.php?action=verify_captcha', {
// method: 'POST',
// headers: { 'Content-Type': 'application/json' },
// body: JSON.stringify({ token: token })
// })
// .then(response => response.json())
// .then(data => {
// if (data.success) {
// 验证成功,隐藏覆盖层并设置有效期
document.getElementById('captcha-overlay').style.display = 'none';
const expirationTime = new Date().getTime() + (CAPTCHA_EXPIRATION_HOURS * 60 * 60 * 1000);
localStorage.setItem(CAPTCHA_EXPIRATION_KEY, expirationTime.toString());
// } else {
// document.querySelector('.captcha-message').style.display = 'block';
// grecaptcha.reset(); // 重置reCAPTCHA,让用户可以再次尝试
// }
// })
// .catch(error => {
// console.error('CAPTCHA verification error:', error);
// document.querySelector('.captcha-message').style.display = 'block';
// grecaptcha.reset();
// });
// 仅为演示目的,假设前端验证成功后直接放行
document.getElementById('captcha-overlay').style.display = 'none';
const expirationTime = new Date().getTime() + (CAPTCHA_EXPIRATION_HOURS * 60 * 60 * 1000);
localStorage.setItem(CAPTCHA_EXPIRATION_KEY, expirationTime.toString());
}
// 页面加载时检查状态并渲染reCAPTCHA(如果需要)
grecaptcha.ready(function(){
if (!checkCaptchaStatus()) {
grecaptcha.render('g-recaptcha-widget', {
sitekey: '您的网站密钥', // 再次替换为您的网站密钥
callback: onCaptchaSuccess
});
}
});
// 异步加载reCAPTCHA API脚本
const script = document.createElement('script');
script.src = "https://www.google.com/recaptcha/api.js?onload=grecaptcha.ready&render=explicit";
script.async = true;
script.defer = true;
document.head.appendChild(script);
</script>代码解释:
将上述HTML、CSS和JavaScript代码集成到WordPress中有几种方法:
使用子主题的functions.php和header.php (推荐)
HTML: 将HTML结构添加到子主题的header.php文件中的<body>标签开头,或者使用wp_body_open钩子。
CSS: 将CSS添加到子主题的style.css文件。
JavaScript: 将JavaScript代码通过wp_head钩子注入。在子主题的functions.php中添加:
function custom_captcha_scripts() {
// 注入HTML (如果不在header.php中直接添加)
// echo '<div id="captcha-overlay">...</div>';
// 注入CSS
echo '<style>';
echo '/* 上述CSS样式 */';
echo '</style>';
// 注入JavaScript
echo '<script>';
echo '/* 上述JavaScript代码 */';
echo '</script>';
}
add_action('wp_head', 'custom_captcha_scripts');
// 如果需要服务器端验证,可以添加一个AJAX处理函数
function verify_captcha_callback() {
// 获取并验证reCAPTCHA token
// 使用 wp_remote_post() 向 Google reCAPTCHA API 发送请求
// 验证成功后返回JSON响应
// error_log('CAPTCHA token received: ' . $_POST['token']); // 调试
$token = isset($_POST['token']) ? sanitize_text_field($_POST['token']) : '';
$secret_key = '您的秘密密钥'; // 替换为您的秘密密钥
$response = wp_remote_post( 'https://www.google.com/recaptcha/api/siteverify', array(
'body' => array(
'secret' => $secret_key,
'response' => $token,
'remoteip' => $_SERVER['REMOTE_ADDR']
)
) );
if ( is_wp_error( $response ) ) {
wp_send_json_error( array( 'message' => 'CAPTCHA verification failed: ' . $response->get_error_message() ) );
}
$body = wp_remote_retrieve_body( $response );
$data = json_decode( $body );
if ( $data->success ) {
wp_send_json_success( array( 'message' => 'CAPTCHA verified successfully!' ) );
} else {
wp_send_json_error( array( 'message' => 'CAPTCHA verification failed.', 'errors' => $data->{'error-codes'} ) );
}
}
add_action('wp_ajax_verify_captcha', 'verify_captcha_callback'); // 登录用户
add_action('wp_ajax_nopriv_verify_captcha', 'verify_captcha_callback'); // 未登录用户注意:在verify_captcha_callback函数中,务必将您的秘密密钥替换为您的reCAPTCHA Secret Key。
使用插件:如果不想修改主题文件,可以使用如"Code Snippets"等插件,将上述CSS和JavaScript代码作为自定义代码片段添加到网站的头部。HTML部分可能需要额外的插件或手动编辑主题文件。
通过上述自定义实现,您可以在WordPress网站上构建一个功能强大的全站强制reCAPTCHA验证系统,实现访问前验证和定时重验的需求。这种方法提供了比传统插件更高的灵活性和控制力,但也要求开发者具备一定的HTML、CSS、JavaScript和PHP知识,并高度重视服务器端验证的安全性。在部署前,务必在测试环境中进行充分的测试,并权衡其对用户体验和SEO可能带来的影响。
以上就是WordPress全站强制reCAPTCHA:实现访问前验证与定时重验的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号