За последние 24 часа нас посетили 74003 программиста и 10184 робота. Сейчас ищут 2620 программистов ...

Валидация для обработчика формы. Обработка введенных данных

Тема в разделе "PHP для новичков", создана пользователем Барс1989, 8 июл 2016.

  1. Барс1989

    Барс1989 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    15
    Симпатии:
    3
    Всем доброго времени суток. У меня возник вопрос. Есть у меня обработчик формы.
    Код (Text):
    1. <!doctype html>
    2. <html>
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <title>Document</title>
    6. </head>
    7.  
    8. <?php
    9. $name = $_POST['name'];
    10. $email = $_POST['mail'];
    11. $msg = $_POST['message'];
    12. $capcha = $_POST['capcha'];
    13. if(isset($_POST['send']))
    14. {
    15.     if(empty($_POST['name']))
    16.     {
    17.         echo 'Заполните Имя';
    18.         exit();
    19.     }
    20.     if(!preg_match("/^[а-яА-ЯёЁa-zA-Z]{3,15}+$/u",$_POST['name']))
    21.     {
    22.         echo 'Имя должно содержать только кириллицу';
    23.         exit();
    24.     }
    25.     if(empty($_POST['mail']))
    26.     {
    27.         echo 'Заполните Ваш E-mail';
    28.         exit();
    29.     }
    30.     if(!preg_match("/^[0-9a-z_]{2,25}+@[0-9a-z_^\.]+\.[a-z]{2,6}+$/",$_POST['mail']))
    31.     {
    32.         echo 'E-mail заполнен не верно.Попробуйте еще раз';
    33.         exit();
    34.     }
    35.    
    36.     if(empty($_POST['message']))
    37.     {
    38.         echo 'Заполните Поле сообщения';
    39.         exit();
    40.     }
    41.    
    42.     if(empty($_POST['capcha']))
    43.     {
    44.         echo 'Введите сумму чисел';
    45.         exit();
    46.     }
    47.     if(!preg_match("[50]",$_POST['capcha']))
    48.     {
    49.         echo 'Не верно введена капча';
    50.         exit();
    51.     }
    52.    
    53.     $email = stripslashes($email);
    54.     $email = htmlspecialchars($email);
    55.     $name = stripslashes($name);
    56.     $name = htmlspecialchars($name);
    57.     $msg = stripslashes($msg);
    58.     $msg = htmlspecialchars($msg);
    59.  
    60.    
    61.     $to = 'моя почта@почта.ru'; //кому отправить
    62.     $subject = 'Сообщение от пользователя';
    63.     $message = 'Имя: '.$name.
    64.     '@-mail: '.$email. 'Сообщение: '.$msg;
    65.                
    66.     if(mail($to,$subject,$message))
    67.     echo '<HTML>
    68.      <HEAD>
    69.      <TITLE>Редирект через 0 секунд</TITLE>
    70.      <META HTTP-EQUIV="Refresh" CONTENT="0; URL=ok.html">
    71.      </HEAD>
    72.      <BODY>
    73.      Ваша заявка принята.
    74.      </BODY>
    75.      </HTML>';
    76.     else
    77.     echo '<HTML>
    78.      <HEAD>
    79.      <TITLE>Редирект через 0 секунд</TITLE>
    80.      <META HTTP-EQUIV="Refresh" CONTENT="0; URL=error.html">
    81.      </HEAD>
    82.      <BODY>
    83.      Извините, что-то пошло не так
    84.      </BODY>
    85.      </HTML>';
    86. }
    87. ?>
    Прочитал, что для защиты от вредоносного кода такой валидации и обработки введенных данных вполне достаточно.Так ли это? Подскажите, если не затруднит, все ли в порядке с ее защитой? И если нет, то как можно ее улучшить? Заранее благодарю!
     
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.178
    Симпатии:
    161
    Адрес:
    GABRIEL
    --- Добавлено ---
    Так во первых короче я ща поправлю а ты читай в код и вникай.
    --- Добавлено ---
    Так во первых короче я ещё попровляю и делаю правильно жди доделаю, а потом вникай.
    --- Добавлено ---
    На попробуй должно работать, я просто улучшил твой код на более читабельный и нормальный разделил html и php поправил функцию мейла, в общем разберайся что не понятно спрашивай.

    PHP:
    1. <?php
    2. if (isset($_POST['submit'])) {
    3.      $name = $_POST['name'];
    4.      $email = $_POST['mail'];
    5.      $msg = $_POST['message'];
    6.      $capcha = $_POST['capcha'];
    7.      if (isset($_POST['send'])) {
    8.           $err = [];
    9.           if (empty($_POST['name'])) {
    10.                $err[] = 'Заполните Имя';
    11.           }
    12.           if (!preg_match("/^[а-яА-ЯёЁa-zA-Z]{3,15}+$/uD", $_POST['name'])) {
    13.                $err[] = 'Имя должно содержать только кириллицу';
    14.           }
    15.           if (empty($_POST['mail'])) {
    16.                $err[] = 'Заполните Ваш E-mail';
    17.           }
    18.           if (!preg_match("/^[0-9a-z_]{2,25}+@[0-9a-z_^\.]+\.[a-z]{2,6}+$/", $_POST['mail'])) {
    19.                $err[] = 'E-mail заполнен не верно.Попробуйте еще раз';
    20.           }
    21.  
    22.           if (empty($_POST['message'])) {
    23.                $err[] = 'Заполните Поле сообщения';
    24.           }
    25.  
    26.           if (empty($_POST['capcha'])) {
    27.                $err[] = 'Введите сумму чисел';
    28.           }
    29.           if (!preg_match("[50]", $_POST['capcha'])) {
    30.                $err[] = 'Не верно введена капча';
    31.           }
    32.           if (empty($err)) {
    33.  
    34.           // За место всей твоей лабуда тут нужно сделать только так если ты хочешь убрать html теги из поля сообщения
    35.           $msg = strip_tags($msg);
    36.  
    37.           $to = 'моя почта@почта.ru'; //кому отправить
    38.           $subject = 'Сообщение от пользователя';
    39.           $message = 'Имя: ' . $name .
    40.               '@-mail: ' . $email . 'Сообщение: ' . $msg;
    41.           $headers = 'From: webmaster@example.com' . "\r\n" .
    42.               'Reply-To: webmaster@example.com' . "\r\n" .
    43.               'X-Mailer: PHP/' . phpversion();
    44.  
    45.           mail($to, $subject, $message, $headers);
    46.                // Заголовки обязательно нужно отправлять если хочешь чтобы письмо адекватно приходило на почту в нормальной кодировке.
    47.                $thisGood = 'Привет всё класссно, письмо отправлено ';
    48.  
    49.           }
    50.  
    51.      }
    52. }
    53. ?>
    54. <!doctype html>
    55. <html>
    56. <head>
    57.      <meta charset="UTF-8">
    58.      <title>Document</title>
    59. </head>
    60. <body>
    61.      <?php if (!empty($thisGood)):?>
    62.          <h1 align="center"><?php echo $thisGood ;?></h1>
    63.      <?php endif ;?>
    64.      <?php if (!empty($err)) :?>
    65.           <?php foreach($err as $error => $value) :?>
    66.                <h1 align="center"><?php echo $value;?></h1>
    67.           <?php endforeach;?>
    68.      <?php endif ;?>
    69. </body>
    70. </html>
     
    #2 askanim, 8 июл 2016
    Последнее редактирование: 8 июл 2016
    Барс1989 нравится это.
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    @Барс1989, а ты знаешь, зачем ты каждую строчку пишешь? Вот к примеру, нахрена строчки 52 -55? Если у тебя в имени только кириллица, и ты проверяешь это регуляркой, откуда там возьмётся что-то ещё, чтоб убирать слеши или кодировать html-сущности? А так здесь 1000 раз обсуждалось, что и когда нужно делать - поищи по форуму.
    --- Добавлено ---
    Вообще, защита делается от чего-то. От чего и кого ты пытаешься защитить, если просто введённые данные отправляются на почту в plaintext-формате?
     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.178
    Симпатии:
    161
    Адрес:
    GABRIEL
    @mkramer я же ему поправил вроде всё.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    @askanim, ну поправить поправил. Зачем там strip_tags, я правда, не сильно понимаю, но может быть.. Если бы письмо в html отправлялось, то htmlspecialchars был бы уместен, а так - почтовик сам знает, что там надо сделать htmlspecialchars, если письмо пришло в plaintext (в случае использования веб-интерфейса почты), так что совершенно лишне ему ещё чем-то помогать.

    Ну и человек должен не бездумно вызовы вставлять, а знать, что и зачем делается. Вот я и спрашиваю, зачем там stripslashes, зачем там htmlspecialchars и прочая лабуда
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Барс1989 нравится это.
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.178
    Симпатии:
    161
    Адрес:
    GABRIEL
    @denis01 знаю можешь вернутсья и посмотреть там где у меня дебаты, были с твоим другом @Ganzal. :) Ну там где я кидал свою уневерсальную форму сборки регистрации, там есть такая спец функция проверки на php, но мне честно тут было не много лень прямо всё исправлять я поправил что прямо у меня глаз выжгло просто. А остальное оставил мелочи. Сам дойдёт поправит потом, главное, чтобы код форматировал правильно, и понимал что для чего, пусть понимает и изучает.


    А вот. во первых я сказал если надо вырезать все теги. заместо всей лабуды что он написал
    @mkramer

    Например такой вариант, ты хочешь отправить определённое форматированное письмо в теге каком то. С твоими шрифтами, а чувак берёт там и свои коды пишет и в итоге что у нас на почту приходит ?) Для таких случаев хелп ми стрип тег
    --- Добавлено ---
    @mkramer а если вдруг он ещё захочет в базу положить это, в чистом виде текста, зачем ему там хранить, теги.... Тоже взял вырезал, пусть знает что такое есть, а вот эти htmlspecial для чего это?) Нафиг, код не нарушит, а в базу он не ложит, а будет ложить в помощь pdo::quote или pdo::prepare
     
    Барс1989 нравится это.
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Отлично
     
  9. Барс1989

    Барс1989 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    15
    Симпатии:
    3
    52-55 строчки поставил скорее для перестраховки. Нашел статью и там на них помимо валидации ставилась еще и обработка заполненной формы, поэтому от нее собственно решил и оттолкнуться. За кириллицу сорь ( строка 22) Я ее изменить забыл. Там не только кириллица. Забыл подправить.

    Меня смущало то, что в сообщении можно отправить скрипт например вредоносный и т.д. Валидацию на поле сообщение не писал же. Вычитал, что нужно добавить
    Код (Text):
    1.    $msg = stripslashes($msg);
    2.    $msg = htmlspecialchars($msg);
    и заодно там разбиралась защита логина и мыла с валидацией, но к ней прибавлялось
    Код (Text):
    1. $email = stripslashes($email);
    2.     $email = htmlspecialchars($email);
    3.     $name = stripslashes($name);
    4.     $name = htmlspecialchars($name);
    askanim, спасибо огромное!!! Спасли! Только вопрос один по коду возник. Строки 34-35. Там защита от html-тегов или от вставок скриптов на perl и т. д. тоже?
     
  10. Барс1989

    Барс1989 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    15
    Симпатии:
    3
    Тут в общем то меня пугает не только письмо пришедшее мне на почту. Как я понял ( я могу ошибаться, так-как не особо еще в полной мере ознакомился с php ), данные будут обрабатываться на стороне сервера же? А потом отправляться на почту. А при обработке сервер может выполнить вредоносный код, что может вызвать краш всего и вся( тут опять же могу ошибаться, так-как познание в php у меня пока еще малы). Собственно тут-то и встал вопрос о защите от вредоносного кода серверной части. Нашел статью по написании гостевой книги http://www.softtime.ru/bookphp/gl11_1.php (взял ее как аналог к моей форме) В той статье помимо валидации майла и т.д.
    Код (Text):
    1.    if (!empty($email))
    2.       /* если введен e-mail, то проверяем с помощью регулярного выражения
    3.       правильность ввода */
    4.       {
    5.         if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
    6.         {
    7.           $action = "";
    8.           $error = $error."<LI> Неверно введен е-mail.&nbsр Введите e-mail
    9.           в виде <i>softtime@softtime.ru</i> \n";
    10.         }
    11.       }
    идет вот такая проверка на обработку введенных данных
    Код (Text):
    1. Теперь обрабатываем введенный пользователем текст функциями удаления HTML-тегов и обратных слешей:
    2.  
    3. $name = substr($_POST["name"],0,32);
    4. $name = htmlspecialchars(stripslashes($name)); // обрабатываем имя
    5. $city = substr($_POST["city"],0,32);
    6. $city = htmlspecialchars(stripslashes($city)); // обрабатываем город
    7. $email = substr($_POST["email"],0,32);
    8. $email = htmlspecialchars(stripslashes($email)); // обрабатываем e-mail
    9. $url = substr($_POST["url"],0,36);
    10. $url = htmlspecialchars(stripslashes($url)); // обрабатываем url-адрес
    11. $msg = substr($_POST["msg"],0,1024);
    12. $msg = htmlspecialchars(stripslashes($msg)); // обрабатываем сообщение
    Собственно отсюда и получилась у меня такая форма :(
    --- Добавлено ---
    Еще раз огромное спасибо за помощь!
    --- Добавлено ---
    Спасибо! Правда я уже пытался применить этот флаг, но форма после этого почему-то перестала работать ( во всем виноваты мои кривые руки видимо :( ), поэтому я собственно от этой затеи отказался, чтобы окончательно форму не поломать своими экспериментами
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Откуда вы все такую чушь берёте? Вся обработка прописана в твоей программе. Содержимое строковых переменных само по себе не выполняется, если ты не передаёшь его в функцию eval. htmlspecialchars используется при выводе в браузер, чтоб браузер не воспринял данные как код. Серверу вообще по барабану. Вот если ты формируешь на стороне php команду другому серверу (sql, к примеру), тогда уже нужно позаботиться, чтоб команда была корректна для того сервера, поскольку он её выполнит. И опять же, ты читал доку, что такое htmlspecialchars и прочее?
     
  12. Барс1989

    Барс1989 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    15
    Симпатии:
    3
    htmlspecialchars, как я понял, преобразует теги и избавляет от внедрения на сервер (sql) вредоносного кода. (Это опять же может быть не верным моим суждением, так-как по части php я совсем зеленый) . Поэтому собственно и возникает вопрос, такая форма сможет ли защитить от поломки сервера, (sql) и засорения почты вредоносным кодом ? А так-как я не силен еще пока в php, то запросто могу вместо защиты наоборот проделать бреши для всего и вся . Поэтому и уповаю на вас
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    А документацию почитать? htmlspecialchars, грубо говоря, заменяет < и > на &lt; и &gt;, а также заменяет некоторые другие сущности. О чём написано https://secure.php.net/manual/ru/function.htmlspecialchars.php. К SQL-инъекциям она вообще никакого отношения не имеет. И даже если бы имела - где у тебя в этом коде SQL? htmlspecilchars используется при выводе введённых пользователем данных, чтобы избежать XSS-атак (https://ru.wikipedia.org/wiki/Межсайтовый_скриптинг)
     
    Барс1989 нравится это.
  14. Барс1989

    Барс1989 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    15
    Симпатии:
    3
    Проблема в том, что я еще не особо понимаю php и собственно все, что я делаю - импровизация. Вот собственно первоначальный обработчик формы с валидацией и обработкой данных , которую я заказал у фрилансера и от которой я собственнопляшу и которую пытаюсь преобразовать.
    Код (Text):
    1. <form method="POST" action="">
    2. Имя<input type="text" name="name"/><br/>
    3. Телефон<input type="text" name="phone"/><br/>
    4. E-mail<input type="email" name="email"/><br/>
    5. <textarea name="message" placeholder="Сообщение"></textarea><br/>
    6. <input type="submit" name="send" value="Отправить">
    7. </form>
    8. <?php
    9. if(isset($_POST['send']))
    10. {
    11.     if(empty($_POST['name']))
    12.     {
    13.         echo 'Заполните Имя';
    14.         exit();
    15.     }
    16.     if(eregi('[0-9]',$_POST['name']))
    17.     {
    18.         echo 'Имя не должно содержать числа или символы';
    19.         exit();
    20.     }
    21.     if(empty($_POST['phone']))
    22.     {
    23.         echo 'Заполните Телефон';
    24.         exit();
    25.     }
    26.     if(!eregi('[0-9]',$_POST['phone']))
    27.     {
    28.         echo 'Телефон должен содержать только цифры';
    29.         exit();
    30.     }
    31.     if(empty($_POST['email']))
    32.     {
    33.         echo 'Заполните E-mail';
    34.         exit();
    35.     }
    36.     if(empty($_POST['message']))
    37.     {
    38.         echo 'Заполните Поле сообщения';
    39.         exit();
    40.     }
    41.  
    42.     $name = $_POST['name'];
    43.     $phone = $_POST['phone'];
    44.     $email = $_POST['email'];
    45.     $mes = $_POST['message'];
    46.     $to = 'почта@почта.ру'; //кому отправить
    47.     $subject = 'Тема';
    48.     $message = 'Имя: '.$name.'
    49.                 Телефон: '.$phone.'
    50.                 E-mail: '.$email.'
    51.                 Сообщение: '.$mes;
    52.              
    53.     if(mail($to,$subject,$message))
    54.     echo 'Успешно отправлено';
    55.     else
    56.     echo 'Ошибка при отправке';
    57. }
    58. ?>
    Как мне объяснил создатель данного обработчика, то убираем эти строки
    Код (Text):
    1. <form method="POST" action="">
    2. Имя<input type="text" name="name"/><br/>
    3. Телефон<input type="text" name="phone"/><br/>
    4. E-mail<input type="email" name="email"/><br/>
    5. <textarea name="message" placeholder="Сообщение"></textarea><br/>
    6. <input type="submit" name="send" value="Отправить">
    7. </form>
    и все чудеснейшим образом работает, защита от всего и вся стоит и т.д.
    Возможно она работала и валидация с обработкой данных в ней есть, но я не заметил где, а данный фрилансер канул в лету :( Данный обработчик должен был подключаться к форме на странице index.html. как пример:
    Код (Text):
    1. <form method="post" action="form.php">
    таким способом, но она не работала. (Возможно валидация с обработкой и была, но я ее не увидел при попытке починить форму, поэтому дописал сам)Тут собственно и началось (возможно неудачное) мое знакомство с php :( Форму собственно поправил как мог и она на данный момент рабочая, но вот валидацию не уверен, что верно сделал, так-как собственно столкнулся с данной проблемой около недели назад ,а до этого вообще с php не был знаком :( Поэтому в документации еще пока не силен :( Спасибо за совет!
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Фрилансер давно видимо писал, судя по eregi. Ну вот у него никакой лишней фигни не стоит в коде. Если не хотите сами разбираться, лучше наймите другого фрилансера, пока не наворотили
     
  16. Барс1989

    Барс1989 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    15
    Симпатии:
    3
    В том то и дело, что собственно хочется самому научиться разбираться, чтобы понимать что есть что . Ибо я лично валидации у него не увидел, а как оказалось
    . Собственно даже ради этого стоить попытаться самому освоить php, чтобы разбираться что есть что. Проблема в том ,что еще времени мало прошло с моего ознакомления с php и мне пока сложно найти ту или иную информацию, как верно нужно делать. Собственно , поэтому и попросил у вас помощи. :)))) Обязательно исправлюсь и научусь со временем.
    . Фрилансер не научит и не поможет советом, а сделает и убежит. Лучше научиться самому (хотя бы понимать, что есть что). Дай человеку рыбу - он будет сыт один день. Научи человека ловить рыбу - он будет сыт всю жизнь.
     
    askanim нравится это.
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
  18. Барс1989

    Барс1989 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    15
    Симпатии:
    3
  19. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.178
    Симпатии:
    161
    Адрес:
    GABRIEL
    Я тоже так думал по началу пока
    lord of the developer мистер @mkramer не многими неделями ранее не вразумил меня магучими словами что это же ёлки просто строка, как она может выполнится, а я такой репу чешу а блин точно это же просто строковое знаечние, если его каким то образом не выполнять, то с ним не чего происходить не будет.
    --- Добавлено ---
    This GOOD. Молодец, аж слеза вышла. Будешь следовать этому принципу скоро догонишь и меня, ведь на самом деле я не так далеко ушёл, просто я сижу и читаю и изучаю каждый день :)
    --- Добавлено ---
    Это на тот случай, если тебе нужно будет вырезать все теги из текста, когда твоя строка пройдёт эту функцию, из неё вырежутся все обозначения типа <?> и у тебя останется только голый текст, который дальше можешь отформатировать так как тебе надо и отправить на почту, ну это как пример, а вообще есть более обширное применение этой функции, но там уже надо ковырять мануал. Например чтобы не вывести на страницу, скрипт какой нибудь. удалять например все теги <script> и тд. но я сам ещё особо сильно не ковырял эту тему, но скоро подойдёт время к этому.
     
    mr.akv и Барс1989 нравится это.
  20. Барс1989

    Барс1989 Новичок

    С нами с:
    30 июн 2016
    Сообщения:
    15
    Симпатии:
    3
    askanim, спасибо за доскональные разъяснения! Очень многое стало понятно благодаря Вам! Вообще за все спасибо!
    Буду очень стараться не отставать и в ближайшем будущем надеюсь тоже помогать на форуме тем, кто только начинает свой путь в освоении PHP! :))))
     
    askanim и mr.akv нравится это.