Валидация электронной почты (email) из данных формы на стороне сервера с помощью php

Для тех, кто решил написать простую (или сложную) программу, получающую данные от пользователя в процессе работы обязательно придётся столкнуться с вопросом валидации данных, введённых пользователем у себя в браузере. Эти данные можно как угодно обрабатывать на стороне клиента, используя навороченные проверки с помощью JavaScript. Но все эти проверки легко обходятся и всегда есть шанс того, что на сервер прилетит не то, что задумано и должно быть заранее проверено на ошибки. В этой статье расскажу, к какому решению по валидации адреса электронной почты (email) я пришёл.

Старт! Честный VDS/VPS, на котором «Лунная База» живет уже 20+ лет

Задумываетесь о том, чтобы поднять свой pet-проект, сайт клиента или настроить окружение для разработки? Уже пора подумать, где арендовать железо.

Лунная База хостится на FirstVDS более 20 лет. Мыслей о том, чтобы перебраться на другой хостинг, не было ни разу (хотя опыт работы с другими вариантами, конечно, есть).

Бывали разные ситуации, но они бывают на любом железе. Главное, что нужно понять: здесь нет маркетинговой шелухи и сказок про «мы всё сделаем за вас». Если вы берете VDS — вам дают полный root, возможность накатить любую ОС и не лезут в ваши конфиги.

Если в саппорт написать с вопросом по вашему коду и получить ответ: «Читайте документацию и разбирайтесь сами» или «Обратитесь к профильному специалисту» — это не повод обижаться. Это повод углубить свои знания в DevOps и сайтостроении! Бегите от тех, кто пообещает: «Мы всё чиним и настраиваем абсолютно бесплатно!». Никто никогда не работает «по доброте душевной» в ущерб себе, а бесплатный сыр в администрировании обычно заканчивается сломанной базой данных.

Что по факту: Гибкое масштабирование ядер и RAM, экономия по сравнению с физическими серверами и адекватная панель ispmanager, если она вам нужна.



Задача о валидации адреса электронной почты (email) на сервере

В общем случае задача о валидации адреса электронной почты (email) на сервере стоит таким образом, что нужно проверить соответствие полученной строки на соблюдение стандартов. И при ближайшем рассмотрении получается, что email - это не просто куски текста, цифр и определённых спец.символов, разделённых @ и .. После внедрения IDN (Internationalized Domain Names — интернационализованные доменные имена) нужно по-хорошему ещё пытаться переводить полученные данные в Punycode, если вдруг окажется, что пользователь решил завести себе мыло с использованием национального алфавита. При этом нужно учесть ещё тот факт, что есть не просто пользователи и злоумышленники (или просто экспериментаторы), которые могут отправить винегрет ланитицы и кирилицы...

В общем, зарывшись в этот вопрос с головой я решил не влазить в эти дебри, тем более, что они куда более извилисты и тернисты. В итоге решил использовать использовать стандартные средства, предлагаемые разработчиками php. Как только они внесут какие-то доработки в язык программирования, так пользователи моих сервисов смогут использовать то, что в текущей версии для них недоступно. Для тех, кто боится потерять своих пользователей, лучше ищите другое решение. В данном вопросе я решил быть консерватором и не поддаваться тем веяниям моды, которые пока не вошли в стандарт языка. Мне так проще. Как быть с пользователями, которые используют нестандартизованные решения — это на их усмотрение. Хотят получить доступ к моим разработкам — зарегистрируют бесплатный ящик на нормальном почтовом сервисе. Хотят выпендрёжа, — это их право.

Важно!
Повторюсь. То, что прилетело к вам на сервер на вход к скрипту-обработчику данных формы, нужно проверять вне зависимости от того, какими бы проверками вы не увешали форму в браузере пользователя. Все эти проверки легко обходятся и на вход скрипту можно прислать любые кракозяблики. =D

Валидация адреса электронной почты (email) на сервере стандартными средствами php

В php есть встроенная функция фильтрации данных для обработки данных форм. Это функция filter_var(), которая фильтрует переменную с помощью определенного фильтра. У неё есть ряд фильтров, которые можно применять для обработки переменной. Я выбрал две, которые должны обеспечить защиту от злоумышленников и не отсекать пользователей, которые совершают какие-то совсем дурацкие ошибки.

  • Фильтр FILTER_SANITIZE_EMAIL, который удаляет все символы, кроме букв, цифр и !#$%&'*+-=?^_`{|}~@.[]. Использую его именно из-за пробелов, так как был не раз свидетелем того, как пользователи упорно ставили пробелы там, где их не должно быть. Зачем они это делают, так и не получилось выяснить при опросе — работа подсознания не поддаётся логическому анализу. =)
  • Фильтр FILTER_VALIDATE_EMAIL , который проверяет, что значение является корректным e-mail. В целом, происходит проверка синтаксиса адреса в соответствии с RFC 822, за исключением того, что не поддерживаются комментарии, схлопывание пробельных символов и доменные имена без точек.

Программа на php валидации адреса электронной почты (email) на сервере стандартными фильтрами

Собственно, как всё это работает, можно проверить, написав простую программу:

<?php
if (isset($_POST['email'])) {$email = $_POST['email'];} else {$email = '';}
$sanitized_email = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_email, FILTER_VALIDATE_EMAIL)) {
    echo "E-mail адрес <font color=green><b>" . $sanitized_email . "</b></font> указан верно<br>\n";
} else {
    echo "E-mail адрес <font color=red><b>" . $sanitized_email . "</b></font> указан неверно<br>\n";
}
?>

<form method="post" action="">
<input type="text" name="email" placeholder="введите email">
<input class="enter" type="submit" value="Enter!">
</form>

Последние четыре строчки — это HTML-код вывода формы для ввода email'а.

Первая строчка if (isset($_POST['email'])) {$email = $_POST['email'];} else {$email = '';} — проверка на то, что поле email было заполнено. Но, при первом обращении к этому скрипту, поле не заполнено. Поэтому, чтобы не сыпались предупреджения, для этого случая, если переменная $_POST['email'] не задана, принудительно объявляем переменную $email с пустым значением ''. После этого интерпретатор php не будет выдавать никаких сообщений, даже, если включен режим отладки.

Во второй строчке $sanitized_email = filter_var($email, FILTER_SANITIZE_EMAIL); применяем фильтр FILTER_SANITIZE_EMAIL. к прилетевшей переменной $email и записываем отфильтрованное в переменную $sanitized_email.

Ну и проверяем полученную переменную фильтром FILTER_VALIDATE_EMAIL. Если проверка проходит filter_var($sanitized_email, FILTER_VALIDATE_EMAIL), выдаём сообщение, что всё хорошо. Если проверка не проходит — всё плохо.

Резюме

Если нет нужны хранить неотфильтрованную переменную, то код можно упростить до:

<?php
if (isset($_POST['email'])) {$email = $_POST['email'];} else {$email = '';}
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "E-mail адрес <font color=green><b>" . $email . "</b></font> указан верно<br>\n";
} else {
    echo "E-mail адрес <font color=red><b>" . $email . "</b></font> указан неверно<br>\n";
}
?>

<form method="post" action="">
<input type="text" name="email" placeholder="введите email">
<input class="enter" type="submit" value="Enter!">
</form>

Просто перепрописав значение переменной $email после применения фильтра: $email = filter_var($email, FILTER_SANITIZE_EMAIL);. Так будет работать наверное чуть быстрее. =)

Таким образом я решил для себя вопрос о том, как сделать валидацию электронной почты (email) из данных формы на стороне сервера с помощью php.

Решает ли это 100% задачи? — Нет!

Но в моём случае этого достаточно.

P.S.

Есть мнение, что валидация email вообще не нужна. Нужно просто послать письмо пользователю на то, что он ввёл с кодом подтверждения. В моём случае — это следующий этап. Но оставлять без проверки того, что прилетело от пользователя в качестве его почты я пока не намерен. Мало ли кто что решит послать на вход моим программам. Да и хранить весь этот хлам в ожидании, пока пользователь (может быть) решит подтвердить свою почту, тоже не хочется. Повторюсь: неадекватные пользователи лично мне не нужны.

Самый честный хостинг за 20+ лет существования Лунной Базы

Задумываешься о том, чтобы поднять свой сайт в Интернете? Уже пора подумать о том, какой хостинг выбрать?

Лунная База хостится 20+ лет на firstDVS. При этом, мыслей о том, чтобы перебраться на другой хостинг не было. (Но, при этом есть опыт работы с другими вариантами.)

Бывали с firstDVS разные ситуации, но, они бывают на всех хостингах. Единственное, что тут важно понять, - это то, что никто ничего тебе не будет впаривать... Но, и работать за тебя тоже никто не станет. Если в саппорт ответили: «Читайте по ссылке и разбирайтесь сами...» или вообще «Обратитесь за помощью к специалисту», - это повод углубить свои знания в области сайтостроения, а не бежать к тем, что пообещают: «Мы всё чиним и всё делаем за своих клиентов абсолютно бесплатно!» Никто никогда ничего ни за кого "по доброте душевной" не делал, не делает и не будет делать!

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню