Почему опытные разработчики никогда не используют regex для валидации email?

Представьте, что вы создаете форму регистрации. Что первое приходит вам в голову? Вставить regex в поле электронной почты. Но это плохой ход. Запись Почему опытные разработчики никогда не используют regex для валидации email? впервые появилась techrocks.ru.

Jan 14, 2025 - 14:47
 0
Почему опытные разработчики никогда не используют regex для валидации email?

Давайте начистоту: валидация email звучит просто, но это техническая ловушка, в которую попадаются даже опытные разработчики.

От редакции Techrocks. Предлагаем почитать:

Что происходит на самом деле?

Представьте, что вы создаете форму регистрации. Что первое приходит вам в голову? Вставить regex в поле электронной почты. Но это плохой ход.

Настоящие, хотя и странные электронные адреса

# Все эти email-адреса технически валидны!
valid_emails = [
    '"J. R. \"Bob\" Dobbs"@example.com',
    'admin@mailserver1',
    'user+tag@gmail.com',
    'postmaster@[123.123.123.123]'
]

Большинство regex-движков их отфильтруют.

Почему?

Стандарты электронной почты ужасно беспорядочны.

Большинство разработчиков удивились бы, узнав, что приведенные выше email-адреса технически допустимы согласно RFC 5322. Эта спецификация разрешает:

  • Кавычки в локальных частях
  • Комментарии в круглых скобках
  • Вложенные комментарии
  • Специальные символы в локальных частях
  • Множественные метки доменов

Скрытые издержки плохой валидации

1. Потеря реальных пользователей

Строгий regex может отклонить совершенно допустимые адреса электронной почты. Представьте, что вы отказываете потенциальному клиенту, потому что его email выглядит «странно». Например, в нем есть:

  • Плюс-адресация (user+tags@gmail.com)
  • Нетрадиционные доменные структуры
  • Международные наборы символов
  • Законные, но сложные соглашения об именовании.

Ваша продуктовая команда была бы очень недовольна, а продажники были бы в ярости.

2. Атаки ReDoS

Regex-движки, использующие поиск с возвратом (англ. backtracking), подвержены ReDoS -атакам (ReDoS — сокращение от Regex Denial of Service).

def dangerous_regex_check(user_input):
    # Этот regex может убить производительность вашего сервера
    evil_pattern = r'^(a+)+b$'
    return re.match(evil_pattern, user_input)

# Всего 30 символов могут положить вашу систему
malicious_input = 'a' * 30 + 'b'

Злоумышленники могут создать такие входные данные, которые катастрофично замедлят вашу функцию валидации.

Более разумный подход

Базовая валидация, которая действительно работает

def smart_email_check(email):
    """Быстрая и грязная проверка email"""
    return (
        email and 
        '@' in email and 
        '.' in email.split('@')[1] and
        len(email) <= 254  # Ограничение длины email
    )

Реальное решение: верификация

  1. Базовая проверка синтаксиса
  2. Отправка проверочной ссылки
  3. Пользователь должен доказать, что указанный им email рабочий
def validate_email(email):
    if not basic_email_check(email):
        return False

    # Послать токен верификации
    token = generate_unique_token()
    send_verification_email(email, token)

    return True

Профессиональные инструменты для настоящих разработчиков

Вместо того чтобы писать свой собственный regex, используйте проверенные библиотеки:

  • Python: email-validator
  • JavaScript: validator.js
  • Java: Apache Commons Validator

Улучшенный класс валидации

class EmailValidator:
    @staticmethod
    def validate(email):
        """
        Smart email validation
        - Quick syntax check
        - Verify deliverability
        """
        try:
            # Use a smart library
            validate_email(
                email, 
                check_deliverability=True
            )
            return True
        except EmailInvalidError:
            return False

Итоги

Валидация электронной почты — это не создание несокрушимой крепости. Ее задачи сводятся к следующему:

  • Впускать реальных пользователей
  • Обеспечивать безопасность вашей системы
  • Не усложнять систему

Поэтому:

  • Забудьте о сложных regex
  • Используйте проверенные библиотеки
  • Отправляйте проверочные электронные письма
  • Будьте дружелюбны к пользователю

Разработчики, подходящие к проблеме валидации правильно, избавляют себя от бесчисленных головных болей.

Перевод статьи “Why experienced developers never use regex for email validation?”.

Запись Почему опытные разработчики никогда не используют regex для валидации email? впервые появилась techrocks.ru.

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow