Суть в следующем. На странице сайта есть форма "Подписка на новости", где посетитель сайта может ввести свой e-mail адрес и подписаться на рассылку. Для того чтобы узнать о подписчике тут же скриптом генерируется _пустое_ письмо на специальные адреса news@domain.ru (для русскоязычных пользователей) или news@domain.net (для англоязычных) со следующими заголовками: Subject: SUBSCRIBE [ru] To: news@domain.ru From: email@test.ru или Subject: SUBSCRIBE [en] To: news@domain.net From: email@test.ru Вот сам скрипт: Код (Text): <?php include $lng."/langfile.php"; //определяем язык ru/en if ( ($_SERVER["REQUEST_METHOD"]=="POST") && !empty($email) ) { //проверяем e-mail if (preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { $er = error_reporting(0); error_reporting(0); //временно отключаем вывод ошибок //сохраняем в файл $f = fopen("subscribe.txt", "a+"); flock($f,LOCK_EX); fputs($f, $email."\n"); fflush($f); flock($f,LOCK_UN); fclose($f); if ($lng == "ru") { $newsemail = "news@domain.ru"; } else { $newsemail = "news@domain.net"; } //и отсылаем e-mail на подписку if (mail($newsemail, "SUBSCRIBE [".$lng."]", "", "From: $email")) { echo '<FONT COLOR=darkblue>'; echo $subscribe_thank.'<BR>'; echo $subscribe_OK.'<BR>'; //Вы подписаны на рассылку новостей проекта echo '</FONT>'; } else { echo '<FONT COLOR=red>'; echo $subscribe_sorry.'<BR>'; echo $subscribe_NA; //Сервис временно недоступен! echo '</FONT>'; } error_reporting($er); //восстанавливаем вывод ошибок } else { echo '<FONT COLOR=red>'; echo $subscribe_sorry.'<BR>'; echo $subscribe_wrong.' <B>'.$email.'</B>'; //Неверно введен е-mail адрес: echo '</FONT>'; } } else { echo '<FONT COLOR=red>'; echo $subscribe_sorry.'<BR>'; echo $subscribe_empty; //Не введен е-mail адрес. echo '</FONT>'; } ?> перед отправкой письма сохраняем введенный e-mail в файл subscribe.txt. Дак вот частенько в файл стал сохраняться не e-mail, а целые куски текста вида: Ну и приходят письма на news@domain.net с этим бредом. Ломаю голову: каким образом удается передать в скрипт в качестве аргумента "email" весь этот бред? И как этого избежать? Примерно так выглядит форма на странице сайта Код (Text): <SCRIPT LANGUAGE="JavaScript"> function subscribe(){ window.open('','subscribe','width=350,height=115'); } </SCRIPT> <FORM name="f_sub" action="subscribe.php" method="post" target="subscribe"> Подписка на новости<BR> <INPUT type="text" name="email" value="e-mail" size="20" maxlength="64" style="width:125;font-size:8pt"> <INPUT type="submit" value="OK" onClick="subscribe()" style="width:30;height:20;font-size:8pt"> </FORM> Т.е. в само поле email больше 64 знаков не вобьешь, а сохраняемый бред гораздо длиннее.
А кто сказал, что данные заполняются через веб-форму? Можно, например, создать программу или скрипт, которая будет отсылать на эту страницу любые данные. Я бы боролся с этим предварительным обрезанием полученных данных до нужной длинны, ну а потом дальше по коду....
Код (Text): "/^[0-9a-z_\-]+@[0-9a-z_\-]+\.[a-z]{2,4}$/i" замените регулярку для проверки мыла на такую.
PWL вызов делают не через форму, а програмно. в адрес подсовывают не строку а текст с \r\n. E-mail инъекция. быстро - удаляй любые \r\n из поля email. я на правильность проверяю так: PHP: <? function OOPS_is_email($s) { # проверяем на синтакс if( !ereg('^[^@]+@[^@]+$', $s) ) return MAILADDR_SYNTAX; list($u, $d) = explode('@', $s); if( eregi('^([0-9a-z]+(-[0-9a-z]+)*[.])+[a-z]{2,3}$', $s)) return MAILADDR_DOMAIN_NAME; if( (!checkdnsrr($d,"SOA") OR !checkdnsrr($d,"A") OR !checkdnsrr($d,"MX")) ) { # проверяем на домен if( !checkdnsrr($d,"SOA") AND !checkdnsrr($d,"A")) return MAILADDR_DOMAIN_EXISTS; # проверяем на обменник if( !checkdnsrr($d,'MX') ) { return MAILADDR_MX_EXISTS; } } # проверяем на имя if( !eregi('^[0-9a-z_\./=+&$-]+$', $u) ) return MAILADDR_NAME; # проверяем на длину if( strlen($s) > 128 ) return MAILADDR_LEN; return MAILADDR_OK; } ?>
Вы не правы. У меня к примеру левая часть мыла с точками — значит я пролетаю? А если мыло на домене 3-его уровня?..
Sarry Код (Text): '~^[0-9a-z_\-\.]+@([0-9a-z_\-]+\.)?[0-9a-z_\-]+\.[a-z]{2,4}$~i' удовлетворяет вашим требованиям?
Вот и интересует, если не с формы, то как же его запускают? Я ж влепил проверку на метод POST (чтобы токо с формы запускалось) $_SERVER["REQUEST_METHOD"]=="POST" или такая проверка не катит? Тогда как правильно проверить? А сам способ проверки корректности email'а меня пока не сильно беспокоит - потом подкручу.
Если из PHP, то можно так PHP: <? $conn = fsockopen($site, $port); if(!$conn){ return false; }else{ $headers = "POST $location HTTP/1.0\r\n" . "Host: $site\r\n" . "Connection: close\r\n" . "User-Agent: $user_agent\r\n". "Content-Type: text/xml\r\n" . "Content-Length: ".strlen($data)."\r\n\r\n"; fputs($conn, $headers); fputs($conn, $data); $response = ""; while(!feof($conn)){ $response .= fgets($conn, 1024); } fclose($conn); ?> Точно так же можно сделать любую программу, которая подключается на порт 80 и посылает данные. В заголовок можно вставить все что угодно: куки, агента, рефер..... А потом вставляется содержимое POST, если не ошибаюсь, то как и в методе GET: var1=value1&var=value1.
PHP берет данные о методе из самого запроса. Скорее всего никак нельзя проверить, посылает данные броузер или левая программа
Ну было сказано с немалой долей сарказма))) Ну, насколько мне известно, регулярные выражения довольно трудоёмкие.
Спасибо всем откликнувшимся. Однако - тема для размышлений, описал я сию проблему своему хостеру, думал может у него какой-то робот на сервере крутится и делает такие пакости, он конечно отмазался, ответив: "По видимому пытаются отправлять спам через вашу форму. В последнее время такие вещи участились. Рекомендую проверять вводиммые адреса на наличие запрещенных символов, например адрес электронной почты не может содержать символа перевода строки.". Но... вот уже второй день ни одного левого письма... а то было по 10-20... Хотя может все-таки стала работать проверка на метод POST, потому как левые письма перестали поступать как раз через пару дней, после того как я добавил эту проверку. Т.е. может где-то в этот промежуток времени выполнялся прокешированный старый скрипт... Не знаю что еще подумать, время покажет.
А где можно поглядеть? 2 440hz - вот еще один RegExp для проверки мыла http://community.livejournal.com/ru_pro ... 47239.html пишут, что соответствует RFC