feat: switch to reCAPTCHA v3 implementation
This commit is contained in:
1 parent
1706012ad3
commit
57bb5babae
2 files changed
+31
-5
No files matched your search
+28
-3
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user