проверка на mail inject

sax player

Новичок
Салям Алейкум всем!
Не знаю, жива ли тема, но я на днях столкнулся с подобной проблемой - нас поимели через mail inject
Я тестил - проверка
if (preg_match('(\n|\r)',$email)){
срабатывает только в случае, когда $email декларируется в двойных кавычках:
$email = "[email protected]\r\nCc: [email protected]; [email protected]";

-~{}~ 24.02.06 18:04:

Проверка
PHP:
if (preg_match('/(\n|\r)/',$email)){
$error = "<li>no_email</li>";
$result=0;
}
работает только при
$email заданной в " ", т.е.
$email = "[email protected]\r\nCc:p[email protected];[email protected]";
при получении переменной из формы через $_POST - не сработала.
Зато, похоже, проверка
[pjp]
if(!ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'. '@'. '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' . '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $address))
$err_msg = $invalid_email;
}
[/php]
подходит:
наряду с проверкой валидности емейла она не пропускает больше одной собаки @.
Как ваше мнение, достаточно ли этого?
 

Фанат

oncle terrible
Команда форума
столкнулся ты с проблемой незнания элементарного синтаксиса пхп.
 

sax player

Новичок
if (preg_match('/(\n|\r)/',$email)){
$error = "<li>no_email</li>";
$result=0;
}
Ну, это я взял с форума - моя - то проверка работает ...
А все знает только бог Савоаф. С регулярками я уже разобрался.
Вопрос в другом: достаточно ли проверки
PHP:
if(!ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'. '@'. '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' . '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $address)) 
$err_msg = $invalid_email;
}
чтобы не пустить mail inject?
 

Фанат

oncle terrible
Команда форума
не знаю.
никакой охоты копаться в трёхэтажном реге, когда вполне достаточна проверка на перевод строки.
 

Фанат

oncle terrible
Команда форума
это мне напоминает анекдот:
- Где ты была всю ночь????
- Мам! Меня изнасиловалииииии!
- Это 5 минут! А где ты была всю ночь????
 

ForJest

- свежая кровь
define('EMAIL_PREG', "/^[-_.[:alnum:]]+@((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i");
Реккомендую этот рег. Нужно просто добавить несколько ещё доменов и можно пользоваться. Он не слишком точный, но удовлетворяет большинству нужд. К тому же mail injection он не допустит точно :).

-~{}~ 25.02.06 18:01:

Рег записан одной строкой и честно утащен мною из юзер-нотисов в мануале по PHP
 

ForJest

- свежая кровь
Lews
Где ты увидел "изврат"? Пожалуйста обоснуй своё мнение.
 

ForJest

- свежая кровь
Lews
Я просил обосновать своё мнение. Ты назвал это извратом. Будь добр ответить за свои слова.
После этого я, возможно, отвечу на вопрос "зачем он".
 

Lews

Новичок
Автор данной темы столкнулся с проблемой. Для ее решения и осознания необходимо:
1) осознать, что строка $str = '\n\r' содержит ЧЕТЫРЕ символа (слэш, буква n, слэш, буква r), а строка $str = "\n\r" содержит ДВА символа (перевод строки, возврат каретки)
2) осознать, что регулярка preg_match('(\n|\r)',$email)) ищет в переменной $email именно символы перехода на новую строку и возврат каретки
3) посмотреть, в каком собсно виде передаются данные
4) чуток подправить регулярку либо вобще ее заменить простым strpos();
а не вставлять малюсенькй рег на пять экранов

Твой черед.
 

ForJest

- свежая кровь
Спасибо.
Но этот рег заодно и валидирует емейл
Для решения данной задачи достаточно проверить правильность email.
Мы проверяем
1. Что введённая строка содержит именно email, а не что-либо ещё.
2. Рега устроена так, что проверяет наличие _одного_ емейл в строке, который занимает всю длину этой строки.
Автору топика удобно в один шаг проверить и то и другое, насколько я понял из приведённой цитаты.
Таким же подходом пользуюсь и я, в своих скриптах. Поэтому проверка с помощью реги является с моей точки зрения логичным и красивым решением.
В строке находится 1 mail, правильного формата. Что, собственно и требуется согласно ограничениям, накладываемым на это поле формы.

-~{}~ 25.02.06 20:30:

У меня этот рег работает в большинстве проектов на протяжении нескольких лет.
И, конечно же я никогда не слышал о mail injection в своих проектах.
 

Lews

Новичок
У меня другая точка зрения - помочь разобраться, почему не работает. А проверка майла на валидность, по-моему, лишена смысла, ведь эта проверка не даст ответа, существует майл такой или нет.
 

ForJest

- свежая кровь
Lews
Твоя точка зрения не повод называть приведённое мною решение "извратом". А повод провести по этому поводу дискуссию. Как технический специалист с техническим специалистом.

-~{}~ 25.02.06 20:42:

А выбор в любом случае сделает топикстартер или другие люди, читающие этот топик.
 

Lews

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

ForJest

- свежая кровь
Lews
Я аргументировал свою позицию. Ты свою. Оба решения приемлемы.
Два решения и возможность выбирать из них это лучше чем твоё единственное мнение, без аргументов, с моей точки зрения.
 
Сверху