Валидация полей

Материал из AOW

Перейти к: навигация, поиск

Содержание

Имя пользователя.

Можно содержать пробелы но нельзя использовать сл. символы: ! # $ % & ( ) * + / ? \ ^ | ~ " ' < >

Email

Нельзя использовать сл. символы: ! # $ % & ( ) * + / ? \ ^ | ~ " ' < > пробел

Точки, Дефис

При разработке веб-сервисов одной из частых рутинных задач является валидация email на корректность. Многие разработчики не видят в этом проблемы и просто вставляют какое-то готовое решение. Встречаясь с нагруженными сервисами, с большим потоком пользователей, понимаешь, что не все готовые решения «одинаково полезны». Зачем нам вообще нужна валидация email? Она нужна прежде всего пользователю, чтобы он мог подтвердить свой email, чтобы ему на его адрес приходили важные сообщения, чтобы он мог восстановить доступ к сервису в случае утери пароля. К тому же на многих ресурсах email используется как главный идентификатор пользователя.

Много раз встречал, что функция валидации email либо некорректна, либо имеет существенные недостатки.

Email, используемый пользователем при регистрации должен быть корректным с точки зрения международного стандарта RFC 2822, но это не всегда возможно.

Соответствие стандартам

Есть несколько путей проверять email на соответствие стандартам:

1) Самый простой и доступный способ для PHP >= 5.2 это использование filter_var

function filter_var_wrapper($email)
{
    return (bool) (filter_var($email, FILTER_VALIDATE_EMAIL) === $email );
}

Внимание! После filter_var() результат необходимо сравнивать эквивалентно (===) с исходным значением, так как после фильтрации может вернуться измененный email.

Главный минус этого способа — это отсечение некоторых реально существующих email. Например, bob.@marley.com. Точка на конце левой части email является нарушением RFC, однако популярный российский почтовый сервер mail.ru разрешал регистрировать такие email вплоть до 2010 года. Таким образом, существует процент пользователей, которые до сих пор пользуются такими почтовыми ящиками, только я честно не понимаю, как им удается регистрироваться на большинстве сайтов.

Еще один пример из наследия mail.ru — super..mario@example.com. Две точки подряд — это тоже нарушение, но с этими пользователями приходится считаться. К счастью, теперь нельзя регистрировать на mail.ru подобные аккаунты.

Еще один неприятный пример, это i.love@ice--cream.com. Домен c двумя дефисами признан не валидным, а значит и все пользователи, использующие email там, ограничены в правах… Стоп, Вы не верите в существование таких доменов? А попробуйте http://1--0.com/ . Не впечатляет? А как насчет http://online---casino.com ? Здесь целых три дефиса подряд. А ведь домены рабочие и соответствуют стандарту.

2) Для строго соответствия RFC 2822 Вы можете использовать код открытого проекта RFC 822 Email Address Parser in PHP. Ссылка на исходный код https://github.com/iamcal/rfc822/blob/master/rfc822.php.

Использование очень простое:
include_once("rfc822.php");
(bool) is_valid_email_address($some_email);

Этот способ решает проблемы доменов, а также многие другие недочеты в официальном варианте PHP filter_var(). Однако он не убережет от преставленного выше способа с двумя точками в имени пользователя, или точки на конце. (еще один луч в сторону mail.ru)

3) Третий способ. Мой любимый и используемый.

function regexp_email_wrapper($email){
    return (bool) preg_match("/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\
x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x
00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\.\x
21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:
\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7
F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\.\x21\x23-\x27
x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01
-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\
x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]
+(?:-+[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[
a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?:
:[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}
(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})
?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?
:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-
f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-
9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-
9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD", 
$email);
}

Это регулярное выражение, из исходников PHP. Оно было переведено с С++ на PHP и дополнено правками, исправляющими те проблемы о которых я писал выше. Таким образом, эта регулярка нормально валидирует email по RFC 2822, разрешает использование нескольких дефисов, а также позволяет использовать в части имени пользователя email две точки и точку на конце. Не забывайте, что регулярки не содержат переносов строк. Будьте аккуратны при копировании.

Эта регулярное выражение работает довольно быстро, несмотря на внешнюю монстроузность. А если Вы используете акселераторы, такие как APC, eAccelerator или XCache, то этот код работает даже быстрее, чем filter_var()

Длина полей

  • Длина, имени от 1 до 256.
  • Длина, email от 1 до 64.
  • Длина, пароля от 6 до 256.
Личные инструменты

Разработка веб-сайтов, автоматизация.
По всем вопросам обращайтесь по телефонам:

+7 495 640 29 90
http://artofweb.ru