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 /> <input type="text" name="subject" id="form-subject" placeholder="Subject" required />
<textarea name="message" id="form-message" rows={5} placeholder="Message" required></textarea> <textarea name="message" id="form-message" rows={5} placeholder="Message" required></textarea>
{/* Google reCAPTCHA Widget */} {/* reCAPTCHA v3 implementation */}
<div className="g-recaptcha" data-sitekey={recaptchaSiteKey} style={{ marginBottom: '15px' }}></div> <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response" />
<script src="https://www.google.com/recaptcha/api.js" async defer></script> <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> <button type="submit" className="btn primary full-width" id="btn-send-message">Send Message</button>
</form> </form>
+3 -2
View File
@@ -34,8 +34,9 @@ export async function POST(request: Request) {
const verifyData = await verifyResult.json(); const verifyData = await verifyResult.json();
if (!verifyData.success) { if (!verifyData.success || (verifyData.score !== undefined && verifyData.score < 0.5)) {
return NextResponse.redirect(new URL('/?status=error&msg=reCAPTCHA verification failed. Please try again.#contact', request.url)); 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 // 2. Rate Limiting via Supabase