Защита веб-приложений от автоматических ботов — одна из ключевых задач современной веб-разработки. Google reCAPTCHA v3 предлагает эффективное решение: она анализирует поведение пользователя в фоновом режиме, не требуя кликов по картинкам или ввода текста. В этой статье мы подробно разберем, как интегрировать reCAPTCHA v3 в проект на Django.
1. Что такое Google reCAPTCHA v3?
reCAPTCHA v3 работает незаметно для пользователя. Она оценивает запросы по шкале от 0.0 (бот) до 1.0 (человек) и позволяет настроить защиту на критичных участках сайта (формы регистрации, комментарии и т.д.).
2. Регистрация reCAPTCHA на сайте Google
- Перейдите на сайт reCAPTCHA и авторизуйтесь через Google-аккаунт.
- Создайте новый проект:
- Название: например, «My Django Project»
- Тип: reCAPTCHA v3
- Домены: укажите домены вашего сайта (для локальной разработки добавьте «localhost»)
- Скопируйте Site Key и Secret Key — они понадобятся для интеграции.
3. Настройка Django-проекта
3.1. Установка зависимостей
pip install requests
3.2. Добавление ключей в settings.py
# settings.py
RECAPTCHA_SITE_KEY = 'ваш_site_key'
RECAPTCHA_SECRET_KEY = 'ваш_secret_key'
RECAPTCHA_REQUIRED_SCORE = 0.5 # Минимальный порог доверия
3.3. Создание приложения для reCAPTCHA
python manage.py startapp captcha
4. Реализация проверки на сервере
4.1. Функция валидации токена
# captcha/utils.py
import requests
from django.conf import settings
def verify_recaptcha(token):
data = {
'secret': settings.RECAPTCHA_SECRET_KEY,
'response': token
}
response = requests.post('https://www.google.com/recaptcha/api/siteverify ', data=data)
result = response.json()
return result.get('success', False) and result.get('score', 0) >= settings.RECAPTCHA_REQUIRED_SCORE
5. Интеграция с формами
5.1. Добавление скрипта в шаблон
<script src="https://www.google.com/recaptcha/api.js?render={% raw %}{{ settings.RECAPTCHA_SITE_KEY }}{% endraw %}"></script>
5.2. Пример формы с защитой
<form id="contactForm">
<input type="text" name="name" required>
<textarea name="message" required></textarea>
<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response">
<button type="submit">Отправить</button>
</form>
<script>
document.getElementById('contactForm').addEventListener('submit', function(e) {
e.preventDefault();
grecaptcha.ready(function() {
grecaptcha.execute('{% raw %}{{ settings.RECAPTCHA_SITE_KEY }}{% endraw %}', {action: 'contactForm'})
.then(function(token) {
document.getElementById('g-recaptcha-response').value = token;
e.target.submit();
});
});
});
</script>
6. Обработка в Django-представлении
from django.http import JsonResponse
from .utils import verify_recaptcha
def contact_view(request):
if request.method == 'POST':
token = request.POST.get('g-recaptcha-response')
if verify_recaptcha(token):
# Обработка валидной формы
return JsonResponse({'status': 'success'})
return JsonResponse({'status': 'error', 'message': 'reCAPTCHA verification failed'}, status=400)
return render(request, 'contact.html')
7. Тестирование
- Используйте тестовый ключ для локальной отладки
- Проверьте поведение при разных значениях
RECAPTCHA_REQUIRED_SCORE
- Протестируйте с помощью инструментов автоматизации (например, Selenium)
8. Оптимизация производительности
- Кэшируйте ответы от Google API на 1-2 минуты
- Ограничьте частоту запросов с одного IP
- Для AJAX-форм используйте одноразовые токены
9. Логирование и мониторинг
# captcha/middleware.py
from .utils import verify_recaptcha
class RecaptchaMiddleware:
def init (self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.method == 'POST' and request.path == '/contact/':
token = request.POST.get('g-recaptcha-response')
request.recaptcha_verified = verify_recaptcha(token)
return self.get_response(request)
10. Распространенные ошибки
- Ошибка 403: Проверьте корректность Secret Key
- Нулевой score: Убедитесь, что action в JavaScript совпадает с ожидаемым
- Проблемы с CORS: Добавьте заголовки Access-Control-Allow-Origin
Заключение
Интеграция Google reCAPTCHA v3 в Django-проект позволяет эффективно бороться с автоматическими ботами, сохраняя удобство для пользователей. Настройте систему логгирования и регулярно анализируйте подозрительные запросы для максимальной защиты вашего веб-приложения.
Написать комментарий