feat: switch to reCAPTCHA v3 implementation

This commit is contained in:
ssbg04 committed 2026-06-06 20:39:45 +08:00
1 parent 1706012ad3
commit 57bb5babae
2 files changed
+31 -5

No files matched your search

+28 -3
View File
@@ -267,9 +267,34 @@ export default async function Home() {
<input type="text" name="subject" id="form-subject" placeholder="Subject" required />
<textarea name="message" id="form-message" rows={5} placeholder="Message" required></textarea>
{/* Google reCAPTCHA Widget */}
<div className="g-recaptcha" data-sitekey={recaptchaSiteKey} style={{ marginBottom: '15px' }}></div>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
{/* reCAPTCHA v3 implementation */}
<input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response" />
<script src={`https://www.google.com/recaptcha/api.js?render=${recaptchaSiteKey}`} async defer></script>
<script dangerouslySetInnerHTML={{ __html: `
document.addEventListener('DOMContentLoaded', function() {
var form = document.getElementById('contact-form');
if (form) {
form.addEventListener('submit', function(event) {
event.preventDefault(); // Stop normal submission
var btn = document.getElementById('btn-send-message');
var originalText = btn.innerText;
btn.innerText = 'Verifying...';
btn.disabled = true;
grecaptcha.ready(function() {
grecaptcha.execute('${recaptchaSiteKey}', {action: 'submit'}).then(function(token) {
document.getElementById('g-recaptcha-response').value = token;
form.submit(); // Now submit the form manually
}).catch(function(err) {
btn.innerText = originalText;
btn.disabled = false;
alert('reCAPTCHA failed to load. Please try again.');
});
});
});
}
});
`}} />
<button type="submit" className="btn primary full-width" id="btn-send-message">Send Message</button>
</form>
+3 -2
View File
@@ -34,8 +34,9 @@ export async function POST(request: Request) {
const verifyData = await verifyResult.json();
if (!verifyData.success) {
return NextResponse.redirect(new URL('/?status=error&msg=reCAPTCHA verification failed. Please try again.#contact', request.url));
if (!verifyData.success || (verifyData.score !== undefined && verifyData.score < 0.5)) {
console.error('reCAPTCHA failed:', verifyData);
return NextResponse.redirect(new URL('/?status=error&msg=reCAPTCHA verification failed (bot behavior detected). Please try again.#contact', request.url));
}
// 2. Rate Limiting via Supabase