Диагностика проблемы: зачем ограничивать регистрацию по домену email
Часто владельцы сайтов на WordPress сталкиваются с необходимостью ограничить регистрацию пользователей по домену электронной почты. Например, разрешить регистрацию только сотрудникам компании с корпоративным доменом или запретить массовую регистрацию с популярных публичных почтовых сервисов. Без такой фильтрации риск спама и нежелательных пользователей возрастает.
Основные признаки необходимости ограничения
- Большое количество регистраций с подозрительными или публичными email-доменами.
- Нежелательные пользователи, мешающие работе сайта.
- Требование безопасности и контроля доступа для внутренних ресурсов.
Пошаговое решение: фильтрация регистрации по домену email с помощью кода
В WordPress можно реализовать проверку email при регистрации с помощью хука registration_errors. Ниже пример, как разрешить регистрацию только с доменом example.com и заблокировать остальные.
add_filter('registration_errors', 'restrict_registration_by_email_domain', 10, 3);
function restrict_registration_by_email_domain($errors, $sanitized_user_login, $user_email) {
$allowed_domain = 'example.com';
$email_domain = substr(strrchr($user_email, '@'), 1);
if(strtolower($email_domain) !== $allowed_domain) {
$errors->add('domain_restriction', __('Регистрация разрешена только с домена example.com'));
}
return $errors;
}
Если нужно разрешить несколько доменов, используйте массив и проверку через in_array:
add_filter('registration_errors', 'restrict_registration_by_multiple_domains', 10, 3);
function restrict_registration_by_multiple_domains($errors, $sanitized_user_login, $user_email) {
$allowed_domains = ['example.com', 'company.org'];
$email_domain = substr(strrchr($user_email, '@'), 1);
if(!in_array(strtolower($email_domain), $allowed_domains)) {
$errors->add('domain_restriction', __('Регистрация разрешена только с доменов example.com и company.org'));
}
return $errors;
}
Проверка результата после внедрения
Чтобы убедиться, что фильтр работает правильно:
- Попробуйте зарегистрироваться с email, не относящимся к разрешённому домену — должна появиться ошибка.
- Зарегистрируйтесь с разрешённым доменом — регистрация должна пройти без ошибок.
- Проверьте, что сообщение об ошибке отображается корректно на странице регистрации.
Если вы используете кастомные формы регистрации (плагины, шаблоны), убедитесь, что хук registration_errors срабатывает или добавьте подобную проверку в обработчик формы.
Частые ошибки и как их исправить
- Ошибка: Фильтр не срабатывает при регистрации через кастомный плагин или REST API.
Решение: Добавьте проверку домена непосредственно в обработчик регистрации плагина или REST эндпоинта. - Ошибка: Домены проверяются с учетом регистра, и некоторые допустимые адреса блокируются.
Решение: Всегда приводите домен к нижнему регистру черезstrtolowerперед сравнением. - Ошибка: Использование функции
strrchrбез проверки, что в email есть символ '@'.
Решение: Добавьте валидацию email перед извлечением домена, например, черезis_email().
Практические советы по безопасности и производительности
- Чтобы избежать обхода ограничения, дополнительно проверяйте email на стороне сервера, а не только через JavaScript.
- Если сайт использует регистрацию через сторонние сервисы (OAuth, соцсети), настройте ограничение на уровне интеграции или после получения email пользователя.
- Для массового контроля регистраций можно использовать WP-Cron для периодической проверки новых пользователей и удаления или деактивации неподходящих.
Сравнение вариантов реализации ограничения по домену email
| Вариант | Плюсы | Минусы | Пример |
|---|---|---|---|
Код через registration_errors |
Легко добавить, не требует плагинов, работает с базовой регистрацией | Не всегда срабатывает с кастомными регистрациями и REST API | В статье |
| Использование плагинов (например, WP Email Domain Restrictions) | Удобный интерфейс, дополнительные настройки | Зависимость от стороннего кода, возможные конфликты | WP Email Domain Restrictions |
| Кастомная проверка в обработчиках REST API и OAuth | Полный контроль, работает с любыми регистрациями | Требует глубокой доработки и тестирования | Зависит от конкретной реализации |