Pull to refresh

Comments 63

UFO landed and left these words here
В сортах наркотиков не разбираюсь. Так что не могу сказать, чем был укурен/унюхан такой программист. Но код определённо слабый, тут нужна полная проверка на сервере + простейшая проверка на клиенте.
Не оскорбляйте умственные способности обезьян.
А зачем вообще проверять валидность email'а на клиенте? Даже отправка формы с полной перезагрузкой страницы была бы все равно быстрее, чем выкачивание 2.5 мб адресов.
На клиенте можно тупо первичную валидацию регекспом сделать, на соответствие формату.
А вот остальное — да, жесть.

PS:
А в идеале, конечно же, фоновая отправка содержимого поля формы на сервер для валидации на событие потери фокуса у этого поля ввода.
Нельзя проверять регекспом email адреса. Уже обсуждалось 1 мильён раз.
Максимум что можно делать на клиенте — это проверять наличие одной собачки, потому что все случаи вы никогда не покроете.
Я имел ввиду простейшую проверку на клиенте, вида "(.+)@(.+)\.(.+)".
А если учесть, что возможны домены типа «yandex», то вы отсеиваете мыло «help@yandex» %)
Ну откиньте же последнюю группу с точкой, и будет щастье :)
Суть, как уже писали ниже, минимальная первичная валидация на клиенте — символы-собака-символы, только для того, чтобы сразу сказать пользователю, что он или опечатался или не заполнил поле.
Да уж, проверять регуляркой на наличие символов и собаки — надо умудриться)

var mail = 'ava@kadava.ka';
var split_mail = mail.split('@');
if(split_mail.length == 3) {
    console.log(true)
}
Оки, признаю, оверхед вышел :) Скорее, в силу привычки. Но смысл то не в этом, а в самой идее.
UFO landed and left these words here
console.log(mail.indexOf('@') > 0)
Пропустит строки вида 'aaa@'.
UFO landed and left these words here
Я таки дочитал.
split_mail.length == 3

<...> эта проверка легко заменяется на
console.log(mail.indexOf('@') > 0)
Эти два кода выдают разный результат. Про последний вариант я ничего не говорил.
UFO landed and left these words here
Да я же не про опечатку в константе говорю, а про идею.

Ещё раз.

var mail1 = 'ava@kadava.ka';
var mail2 = 'ava@';

var split_mail = mail1.split('@');
console.log(split_mail.length == /*3*/ 2) // true

split_mail = mail2.split('@');
console.log(split_mail.length == 2) // false

console.log(mail1.indexOf('@') > 0) // true
console.log(mail2.indexOf('@') > 0) // true
split_mail = mail2.split('@');
console.log(split_mail.length == 2) // false


Вы уверены?
Кстати да, выдает true. Это уже ошибка, а не опечатка :)
UFO landed and left these words here
Это вы мне отвечали?

Я-то как раз обращался к AraneusAdoro с предложением проверить, получается ли false.
UFO landed and left these words here
Но я-то на почту уведомление получил… Ну да ладно. :)
Уже нет. Не ожидал, что в сплите будет пустая строка, каюсь.

Ну тогда оба примера с ошибками, только разного плана.
Я почему и поставил проверку на длину. До этого еще стоит бы тримировать строку.
UFO landed and left these words here
Вообще говоря, в одном валидном e-mail может быть две собаки. RFC 2821 явно говорит, что всё, что до первой (незаквоченной) собаки — дело сервера, и не нам это валидировать. То есть всякий трэш вроде "A--Sf#zfr@s%r d@$\\sf+?*ser"@test.com — вполне себе валидный адрес.

tools.ietf.org/html/rfc3696#section-3 говорит об этом немного подробнее.
UFO landed and left these words here
до первой (незаквоченной) собаки
Т.е. вы реально считаете, что операцию, которая проводится на клиенте раз в кучу времени, стоит реализовывать так, чтобы у вашего последователя глаза выпали?

Оптимизация головного мозга, имхо.
Из вот таких мелких деталей и выстраивается проект. Имхо оптимизацию нужно искать в каждой детали, чтобы потом это вошло в обыденность.
Тут и количество рефакторинга уменьшается, и качество кода повышается, и скорость исполнения. Да и для самого что-то новое открывается.
Есть валидные адреса, не соответствующие этой схеме. UUCP mail еще местами работает.

!somedomain!somehost!user
Ниразу такого не видел. Можно плз деталей, где и как это используется?
Это способ записи адреса для Unix to Unix Copy Protocol, который местами еще не отключили. Одно время его весьма активно использовали для почты. en.wikipedia.org/wiki/UUCP#Mail_routing

К слову, какой нибудь sendmail его до сих пор поддерживает.
Ну вы бы привели пример, где его не отключили? Я его лет 15 уже нигде не видел.
Можно ещё проверять наличие любых символов до и после собачки, а так да, толку от здоровенных регэкспов немного(причём не только на клиенте).
Опередили меня…
Об этом, собственно, и статья.
Как показывает практика, на фронтенде достаточно проверить в адресе наличие @, ну а сверять со списком — вообще бред, имхо.
И кстати, на сервере в большинстве случаев тоже. Если нужно проверить адрес просто на валидность, то нужно чтоб была одна собака и что-то вокруг неё.
Превед потенциальные уязвимости :)
Нужно, как минимум, проверять на соответствие RFC, сразу после приема формы сервером.
Уязвимости типа арабских букв, вешающих Сафари? Ну дык это тоже валидный адрес (при наличии собаки в середине).
Не забываем про IDN и надвигающиеся домены первого уровня.

Или имелся в виду HTML? Его конечно надо тогось.
В моей практике были случаи, когда через contact us форму легко и свободно осуществляли спам-рассылки. Там тоже была валидация вида «есть собака — все ок», совершенно не учитывая, что туда можно запихать все что угодно, начиная от списка из двух-трех десятков адресов, и заканчивая JS-кодом и SQL-инъекциями.
Ну да, пожалуй про одну собаку я слишком утрировал. Вот такой регэксп использую: /^([^\s\'\"]+)\@([^\s\'\"]+)$/
Ну и до него над всеми перед переданными данными делается strip_tags.
Кавычки-то вам чем не угодили? А группируете зачем? А собаку зачем экранируете?
Кстати, если на сервере php (> 5.2), то проверка очень простая:

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // ok, validated
}

Почему-то многие про это забывают (или не знают) и по старинке лепят регекспы или встроенные функции их движка (который чаще всего регулярками и проверяет).
естественно там регексп. Речь о том, что это встроенная функция и будет работать быстрее + работать правильно, чем написанный на коленке регексп.
То есть вы в принципе не против регекспов? Тогда не совсем понятно, почему вы считаете, что по старинке лепить регекспы — хуже, чем использовать filter_var().
Правильность: этот регексп был туда притащен из встроенной функции движка Squiloople. Поэтому, не вдаваясь непосредственно в код самих регекспов, нельзя сказать, насколько он правильнее регекспа какого-то другого движка.
Скорость: чему там быть быстрее? И там и там будет вызов PCRE.
Речь о том, что люди начинают изобретать велосипед, часто даже регекспы неправильные пишут, когда уже все есть и готовое.
Спор о том, какой regexp использовать в конце концов привели к тому, что большинство согласилось, что никакой :)

И, к сожалению, авторитет авторов библиотек PHP не позволяет сделать заявления «что это встроенная функция и будет работать быстрее + работать правильно». Увы, это не всегда так.
Последнюю строчку прочитал как:
ПРЕДУПРЕЖДЕНИЕ: Злоупотребление наркотиками плохо влияет на ваш исходный мозг
Все не так плохо! Там хотя бы break; стоит в цикле ;)
Фиг с валидацией — мало ли дырявых релеев. Какая адресная книга по универу удобная!

Тот автор случайно нигде не делал валидацию кредитных карт?
Естественно надо на стороне сервера и естественно асинхронный запрос…
Адовому программеру было лень писать AJAX и он запилил «в лоб». (а чё, работает же!))
С приходом html5 на клиенте проверяю с помощью:
<input type="email" />
Дико бесит когда сервис не принимает е-мейл в зоне .info; Кстати если не путаю — на госуслуги меня с таким адресом не пустили, пришлось другой давать.
Шел 2013 год, а программисты все спорили как проверять валидность email.
Sign up to leave a comment.

Articles