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 />
|
<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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in new issue
Block a user