PHP RegEx: поиск уязвимости в шаблоне проверки электронной почты

Следующий шаблон регулярного выражения (для PHP) предназначен для проверки любого адреса электронной почты:

^[\w.-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$

В нем говорится: «соответствуйте по крайней мере одной (или более) буквам верхнего и/или нижнего регистра, и/или точкам, знакам подчеркивания и/или тире, за которыми следует один и только один @ , за которым следует не менее одной (или нескольких) букв верхнего и/или нижнего регистра, и/или точек, и/или знаков подчеркивания, за которыми следует одна и только одна точка , за которым следуют от двух до шести букв верхнего и/или нижнего регистра.

Кажется, это соответствует любому адресу электронной почты, который я могу придумать. Тем не менее, это ощущение того, что все сделано правильно, вероятно, обманчиво. Может ли кто-нибудь знающий указать на очевидную или не столь очевидную уязвимость в этом шаблоне, о которой я не знаю, из-за которой он не выполняет проверку электронной почты так, как это должно быть?

(Чтобы предвидеть возможный ответ, я знаю, что функция filter_var() предлагает более надежное решение, но в данном случае меня особенно интересует регулярное выражение.)

ПРИМЕЧАНИЕ. это теоретический вопрос о регулярном выражении PHP, а НЕ практический вопрос о проверке электронных писем. Я просто хочу определить ограничения того, что разумно возможно с регулярным выражением в этом случае.

Заранее спасибо!


person Dimitri Vorontzov    schedule 14.02.2013    source источник
comment
Например, электронное письмо может содержать символы плюса (+). Вы уже видели регулярное выражение, совместимое с RFC, не так ли? Также см. этот вопрос   -  person galymzhan    schedule 14.02.2013
comment
Я сделал. Я задаю вопрос, потому что хочу увидеть пример практического адреса электронной почты, который не будет соответствовать этому шаблону.   -  person Dimitri Vorontzov    schedule 14.02.2013


Ответы (2)


Использование регулярных выражений для проверки электронных писем сложно

Попробуйте следующее электронное письмо в качестве входных данных для вашего регулярного выражения, например: ^[\w.-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$

[email protected]

Подробнее о проверке регулярных выражений электронной почты можно узнать на странице http://www.regular-expressions.info/email.html

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

person Josnidhin    schedule 14.02.2013
comment
СПАСИБО, это то, что я искал. - person Dimitri Vorontzov; 14.02.2013

Спецификация адреса электронной почты довольно сумасшедшая. Существуют регулярные выражения, которые могут выполнить для него полную проверку, но они имеют длину в тысячи символов. Возможно, будет лучше разобрать его самостоятельно, но PHP имеет встроенный валидатор для адресов электронной почты:

filter_var($email, FILTER_VALIDATE_EMAIL);

РЕДАКТИРОВАТЬ:

В ответ на ваш конкретный вопрос об адресе электронной почты, который не будет работать, любой, у которого есть имя электронной почты в кавычках, будет, потому что вы вообще не учитываете их:

"explosion-pills"@aysites.com
person Explosion Pills    schedule 14.02.2013
comment
Спасибо. Я знаю об опции filter_val(). Но это не то, о чем я спрашивал. - person Dimitri Vorontzov; 14.02.2013
comment
Спасибо, @Explosion Pills! - person Dimitri Vorontzov; 14.02.2013
comment
@DimitriVorontzov Если это только одна точка, как в ... или строчных буквах, и / или точках, и / или знаках подчеркивания, за которыми следует одна и только одна точка, за которой следуют от двух до шести букв верхнего и / или нижнего регистра. тогда потерпит неудачу [email protected]? - person Steve; 05.12.2015