Проблема с обработкой формы, защита от спама

Тема в разделе "PHP", создана пользователем shede, 12 апр 2018.

  1. shede

    shede

    Регистрация:
    11 авг 2016
    Сообщения:
    84
    Симпатии:
    46
    Есть несколько форм на сайте из за спама решил добавить скрытое поле в формы. Но возникла проблема, одна форма работает, вторая нет, не могу понять в чем причина.
    Код первой формы, которая работает:
    HTML:
                                   <form action="call.php" method="post">
                                       <input id="check" name="check" type="hidden" value="" />
                                      <input class="text-kredit" type="text" name="name" required placeholder="Имя">
                                      <input class="text-kredit" type="text" name="phone1" required placeholder="Номер телефона">
                                      <input style="display:none" type="text" name="tovar" value="<?php echo $title; ?>">
                                      <input class="text-kredit" type="textarea" name="komment" placeholder="Комментарий к заявке (необязательно)">
                                      <p class="pravila"><input type="checkbox" required name="pravila"> Я согласен с <a href="privacy">политикой конфиденциальности</a></p>
                                      <input class="btn-kredit" name="submit" type="submit" onclick="document.getElementById('check').value = 'stopSpam';" value="Отправить">
                                   </form>
    
    И ее обработчик:
    PHP:
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Спасибо за заявку!</title>
    </head>
    <body>
    <?php
    if ($_POST['check'] != 'stopSpam') exit('Spam decected');
    $recepient "[email protected]";
    $sitename "atv-moto.org";
    $name trim($_POST["name"]);
    $familiya trim($_POST["familiya"]);
    $otchestvo trim($_POST["otchestvo"]);
    $gorod trim($_POST["gorod"]);
    $tovar trim($_POST["tovar"]);
    $stoimost trim($_POST["stoimost"]);
    $komment trim($_POST["komment"]);
    $phone1 trim($_POST["phone1"]);
    $message "
    Имя: 
    $name\n
    Контактный телефон: 
    $phone1\n
    Страница: 
    $tovar\n
    Комментарий клиента: 
    $komment";

    $pagetitle "Заказ звонка: $name $phone1. Страница: $tovar";
    mail($recepient$pagetitle$message"Content-type: text/plain; charset=\"utf-8\"\n From: $recepient");
    ?>
    <h1>Спасибо, Ваша заявка принята.</h1>Мы скоро обязательно свяжемся с Вами!<br/><a href="/">Вернуться на сайт</a>
    </body>
    </html>
    Вот вторая форма, которая не работает:
    HTML:
    <form action="postavshikam.php" method="post">
                                        <input id="check" name="check" type="hidden" value="" />
                                       <input class="text-kredit" type="text" name="company" required placeholder="Название компании">
                                       <input class="text-kredit" type="text" name="gorod" required placeholder="Город">
                                       <input class="text-kredit" type="text" name="name" required placeholder="Контактное лицо">
                                       <input class="text-kredit" type="text" name="phone1" required placeholder="Номер телефона">                                 
                                       <input class="text-kredit" type="email" name="email" required placeholder="Email">                                 
                                       <input class="text-kredit" type="text" name="site" placeholder="Адрес сайта">
                                       <textarea class="text-kredit comment" type="text" required name="komment" placeholder="Коротко опишите коммерческое предложение"></textarea>
                                       <p class="pravila"><input type="checkbox" required name="pravila"> Я согласен с <a href="privacy">политикой конфиденциальности</a></p>
                                       <input class="btn-kredit" name="submit" type="submit" onclick="document.getElementById('check').value = 'stopSpam';" value="Отправить">
                                    </form>
    Вот ее обработчик:
    PHP:
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Спасибо за заявку!</title>
    </head>
    <body>
    <?php
    if ($_POST['check'] != 'stopSpam') exit('Spam decected');
    $recepient "[email protected]";
    $sitename "atv-moto.org";
    $name trim($_POST["name"]);
    $site trim($_POST["site"]);
    $company trim($_POST["company"]);
    $gorod trim($_POST["gorod"]);
    $email trim($_POST["email"]);
    $komment trim($_POST["komment"]);
    $phone1 trim($_POST["phone1"]);
    $message "
    Имя: 
    $name\n
    Телефон: 
    $phone1\n
    Адрес сайта: 
    $site\n
    Название компании: 
    $company\n
    Город: 
    $gorod\n
    Электронная почта: 
    $email\n
    Коммерческое предлоение: 
    $komment";

    $pagetitle "Заявка на сотрудничество: $company $name $phone1";
    mail($recepient$pagetitle$message"Content-type: text/plain; charset=\"utf-8\"\n From: $recepient");
    ?>
    <h1>Спасибо, Ваша заявка принята.</h1>Мы скоро обязательно свяжемся с Вами!<br/><a href="/">Вернуться на сайт</a>
    </body>
    </html>
    При заполнении нерабочей формы выходит сообщение Spam decected
     
  2. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    бодрого времени, посмотрите в сторону CSRF протекции токеном, вот пример.
     
    shede нравится это.
  3. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Если формы на одной страницы, у скрытых полей должны быть разные id, иначе используется всегда только одно из полей.
     
    shede нравится это.
  4. shede

    shede

    Регистрация:
    11 авг 2016
    Сообщения:
    84
    Симпатии:
    46
    Как же я сам не догнал(( Спасибо, решил поставить рекапчу гугл, скрытие поля увы не спасло от спама
     
  5. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Оно и не удивительно: ключ то постоянный, достаточно его один раз увидеть и дальше можно через эту форму слать спам сколько угодно.
    Вариант с динамическим ключём тоже не идеален: если бот использует браузер, то сможет работать с формой как реальный пользователь. В общем, единственная реальная защита - это капча (а дальше зависит от качества капчи и продвинутости ботов).
     
    Baco и shede нравится это.