За последние 24 часа нас посетили 64046 программистов и 1740 роботов. Сейчас ищут 918 программистов ...

Каким ненормальным образом удается запустить скрипт?

Тема в разделе "Работа с почтой", создана пользователем PWL, 20 мар 2006.

  1. PWL

    PWL Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    5
    Симпатии:
    0
    Суть в следующем. На странице сайта есть форма "Подписка на новости", где посетитель сайта может ввести свой 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):
    1. <?php
    2. include $lng."/langfile.php"; //определяем язык ru/en
    3.  
    4. if ( ($_SERVER["REQUEST_METHOD"]=="POST") && !empty($email) ) {
    5.  
    6.   //проверяем e-mail
    7.   if (preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) {
    8.     $er = error_reporting(0);
    9.     error_reporting(0); //временно отключаем вывод ошибок
    10.     //сохраняем в файл
    11.     $f = fopen("subscribe.txt", "a+");
    12.     flock($f,LOCK_EX);
    13.     fputs($f, $email."\n");
    14.     fflush($f);
    15.     flock($f,LOCK_UN);
    16.     fclose($f);
    17.  
    18.     if ($lng == "ru") {
    19.       $newsemail = "news@domain.ru";
    20.     } else {
    21.       $newsemail = "news@domain.net";
    22.     }
    23.  
    24.     //и отсылаем e-mail на подписку
    25.     if (mail($newsemail, "SUBSCRIBE [".$lng."]", "", "From: $email")) {
    26.       echo '<FONT COLOR=darkblue>';
    27.       echo $subscribe_thank.'<BR>';
    28.       echo $subscribe_OK.'<BR>';    //Вы подписаны на рассылку новостей проекта
    29.       echo '</FONT>';
    30.     } else {
    31.       echo '<FONT COLOR=red>';
    32.       echo $subscribe_sorry.'<BR>';
    33.       echo $subscribe_NA;           //Сервис временно недоступен!
    34.       echo '</FONT>';
    35.     }
    36.     error_reporting($er); //восстанавливаем вывод ошибок
    37.   } else {
    38.     echo '<FONT COLOR=red>';
    39.     echo $subscribe_sorry.'<BR>';
    40.     echo $subscribe_wrong.' <B>'.$email.'</B>'; //Неверно введен е-mail адрес:
    41.     echo '</FONT>';
    42.     }
    43. } else {
    44.   echo '<FONT COLOR=red>';
    45.   echo $subscribe_sorry.'<BR>';
    46.   echo $subscribe_empty;            //Не введен е-mail адрес.
    47.   echo '</FONT>';
    48. }
    49. ?>
    перед отправкой письма сохраняем введенный e-mail в файл subscribe.txt.

    Дак вот частенько в файл стал сохраняться не e-mail, а целые куски текста вида:
    Ну и приходят письма на news@domain.net с этим бредом.
    Ломаю голову: каким образом удается передать в скрипт в качестве аргумента "email" весь этот бред? И как этого избежать?

    Примерно так выглядит форма на странице сайта
    Код (Text):
    1. <SCRIPT LANGUAGE="JavaScript">
    2. function subscribe(){
    3.  window.open('','subscribe','width=350,height=115');
    4. }
    5. </SCRIPT>
    6.  
    7. <FORM name="f_sub" action="subscribe.php" method="post" target="subscribe">
    8.    Подписка на новости<BR>
    9.    <INPUT type="text" name="email" value="e-mail" size="20" maxlength="64" style="width:125;font-size:8pt">&nbsp;&nbsp;<INPUT type="submit" value="OK" onClick="subscribe()" style="width:30;height:20;font-size:8pt">
    10. </FORM>
    Т.е. в само поле email больше 64 знаков не вобьешь, а сохраняемый бред гораздо длиннее.
     
  2. Mavir

    Mavir Guest

    А кто сказал, что данные заполняются через веб-форму? Можно, например, создать программу или скрипт, которая будет отсылать на эту страницу любые данные.
    Я бы боролся с этим предварительным обрезанием полученных данных до нужной длинны, ну а потом дальше по коду....
     
  3. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Код (Text):
    1. "/^[0-9a-z_\-]+@[0-9a-z_\-]+\.[a-z]{2,4}$/i"
    замените регулярку для проверки мыла на такую.
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    PWL
    вызов делают не через форму, а програмно. в адрес подсовывают не строку а текст с \r\n. E-mail инъекция.

    быстро - удаляй любые \r\n из поля email.

    я на правильность проверяю так:
    PHP:
    1. <?
    2.  
    3. function OOPS_is_email($s) {
    4.  
    5.     # проверяем на синтакс
    6.     if( !ereg('^[^@]+@[^@]+$', $s) )
    7.         return MAILADDR_SYNTAX;
    8.  
    9.     list($u, $d) = explode('@', $s);
    10.  
    11.     if( eregi('^([0-9a-z]+(-[0-9a-z]+)*[.])+[a-z]{2,3}$', $s))
    12.         return MAILADDR_DOMAIN_NAME;
    13.  
    14.  
    15.     if( (!checkdnsrr($d,"SOA") OR !checkdnsrr($d,"A") OR !checkdnsrr($d,"MX")) ) {
    16.  
    17.         # проверяем на домен
    18.         if( !checkdnsrr($d,"SOA") AND !checkdnsrr($d,"A"))
    19.             return MAILADDR_DOMAIN_EXISTS;
    20.  
    21.         # проверяем на обменник
    22.         if( !checkdnsrr($d,'MX') ) {
    23.             return MAILADDR_MX_EXISTS;
    24.         }
    25.     }
    26.  
    27.  
    28.     # проверяем на имя
    29.     if( !eregi('^[0-9a-z_\./=+&$-]+$', $u) )
    30.         return MAILADDR_NAME;
    31.  
    32.     # проверяем на длину
    33.     if( strlen($s) > 128 )
    34.         return MAILADDR_LEN;
    35.  
    36.     return MAILADDR_OK;
    37. }
    38. ?>
     
  5. Sarry

    Sarry Активный пользователь

    С нами с:
    9 мар 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Столица Донского казачества
    Вы не правы. У меня к примеру левая часть мыла с точками — значит я пролетаю?
    А если мыло на домене 3-его уровня?..
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
  7. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Sarry
    Код (Text):
    1. '~^[0-9a-z_\-\.]+@([0-9a-z_\-]+\.)?[0-9a-z_\-]+\.[a-z]{2,4}$~i'
    удовлетворяет вашим требованиям? ;)
     
  8. Belegnar

    Belegnar Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    299
    Симпатии:
    0
    есть же правильная регулярка для проверки почты, нафига велосипед изобретать?
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Belegnar
    а нкоторые считают, что:
    1. их велосипед лучше
    2. практикуются в регулярках.
     
  10. PWL

    PWL Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    5
    Симпатии:
    0
    Вот и интересует, если не с формы, то как же его запускают?
    Я ж влепил проверку на метод POST (чтобы токо с формы запускалось)

    $_SERVER["REQUEST_METHOD"]=="POST"

    или такая проверка не катит? Тогда как правильно проверить?

    А сам способ проверки корректности email'а меня пока не сильно беспокоит - потом подкручу.
     
  11. PWL

    PWL Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    5
    Симпатии:
    0
    Ё моё, это ж надо было изобрести :shock:
     
  12. Mavir

    Mavir Guest

    Если из PHP, то можно так
    PHP:
    1. <?
    2.     $conn = fsockopen($site, $port);
    3.     if(!$conn){
    4.       return false;
    5.     }else{
    6.  
    7.       $headers =
    8.       "POST $location HTTP/1.0\r\n" .
    9.       "Host: $site\r\n" .
    10.       "Connection: close\r\n" .
    11.       "User-Agent: $user_agent\r\n".
    12.       "Content-Type: text/xml\r\n" .
    13.       "Content-Length: ".strlen($data)."\r\n\r\n";
    14.      
    15.       fputs($conn, $headers);
    16.       fputs($conn, $data);
    17.  
    18.       $response = "";
    19.       while(!feof($conn)){
    20.         $response .= fgets($conn, 1024);
    21.       }
    22.       fclose($conn);
    23. ?>
    24.  
    Точно так же можно сделать любую программу, которая подключается на порт 80 и посылает данные. В заголовок можно вставить все что угодно: куки, агента, рефер..... А потом вставляется содержимое POST, если не ошибаюсь, то как и в методе GET: var1=value1&var=value1.
     
  13. Mavir

    Mavir Guest

    PHP берет данные о методе из самого запроса. Скорее всего никак нельзя проверить, посылает данные броузер или левая программа
     
  14. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    PWL
    подделать POST - дело 1 минуты.
     
  15. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    зато именно это учитывает ВСЕ стандарты.
     
  16. ohh...again?

    ohh...again? Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    39
    Симпатии:
    0
    Зато при должном количестве пользователей уронит почти любой сервер)))))
     
  17. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ohh...again?
    почему же уронит? с чего?
     
  18. ohh...again?

    ohh...again? Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    39
    Симпатии:
    0
    Ну было сказано с немалой долей сарказма))) Ну, насколько мне известно, регулярные выражения довольно трудоёмкие.
     
  19. PWL

    PWL Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    5
    Симпатии:
    0
    Спасибо всем откликнувшимся.

    Однако - тема для размышлений, описал я сию проблему своему хостеру, думал может у него какой-то робот на сервере крутится и делает такие пакости, он конечно отмазался, ответив: "По видимому пытаются отправлять спам через вашу форму. В последнее время такие вещи участились. Рекомендую проверять вводиммые адреса на наличие запрещенных символов, например адрес электронной почты не может содержать символа перевода строки.". Но... вот уже второй день ни одного левого письма... а то было по 10-20...

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

    PWL Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    5
    Симпатии:
    0
    А где можно поглядеть?

    2 440hz - вот еще один RegExp для проверки мыла :D
    http://community.livejournal.com/ru_pro ... 47239.html
    пишут, что соответствует RFC