За последние 24 часа нас посетили 7718 программистов и 446 роботов. Сейчас ищет 91 программист ...

Защита формы от спама - PHP

Тема в разделе "PHP для новичков", создана пользователем FCSM, 15 янв 2018.

Метки:
  1. FCSM

    FCSM Новичок

    С нами с:
    11 апр 2017
    Сообщения:
    9
    Симпатии:
    0
    Ребят, всем привет.

    Решил защитить форму сайта от спама и нашёл в интернете интересный способ, который меня устроил.

    Суть способа :

    В форму, которую нужно защитить от спама, нужно добавить вот это

    HTML:
    1. <input id="check" name="check" type="hidden" value="" />
    2.  
    Потом в кнопку, которая отправляет сообщение, нужно добавить это
    Код (Javascript):
    1. onclick="document.getElementById('check').value = 'secretcode';"
    И в PHP обработчик, нужно добавить вот это

    PHP:
    1. if ($_POST['check'] != 'secretcode') exit('Spam decected');
    На одном сайте, я это всё добавил и всё замечательно работает.

    Но появилась необходимость добавить на другой сайт и появилась проблема.

    Нормально работает только одна из форм, а при попытке отправить сообщение с других форм, появляется пустая страница с надписью - "Spam decected", и сообщение не отправляется.

    В чём может быть причина ?
     
  2. voral

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

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Например в каждой форме свое поле check при этом id у них одинаковый
     
  3. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Смотри в консоли браузера, может быть где-то что-то не так оформил раз работает в другом месте. Скорее всего онклик не срабатывает и не меняет валъю.
     
    #3 keren, 15 янв 2018
    Последнее редактирование: 15 янв 2018
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.762
    Симпатии:
    518
    Адрес:
    Татарстан
    спопсоб не идеальный... причем не будет работать при сабмите формы не через кнопку а например по нажатию на Enter
     
  5. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    Ну так а откуда обработчик знает, какой secretcode нужно сравнивать с отправленным?

    Сгенерированный secretcode нужно, наверное, где-то сохранять при каждой новой генерации и потом уже сравнивать текущий с отправленным - вот логика CSRF защиты.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.967
    Симпатии:
    472
    Так он походу постоянный собирается использовать :)
    --- Добавлено ---
    @FCSM, хотя бы периодически его меняйте, но не единовременно, как вам было написано на киберфоруме.
    --- Добавлено ---
    Вот пользователь удивится, если у него отключен JS. А, чЁ, у всех всегда включен?! Ну я к примеру иногда отключаю JS и забываю потом сразу включить.
    --- Добавлено ---
    Проверка при использовании «двухэтапного устаревания» делается примерно так:
    Код (Text):
    1. if ($_POST['key']==$newkey||$_POST['key']==$oldkey&&time()<strtotime($expire)) echo 'OK';
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.929
    Симпатии:
    1.564
    Лучше на onsubmit :) И не по ID, а искать элемент прямо в форме, чтоб универсально было.
    Сейчас же большая часть сайтов с отключённым JS перестаёт работать сразу
    --- Добавлено ---
    Особенно с ростом популярности всяких Angular, VueJs, React и пр.
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.967
    Симпатии:
    472
    P.S. И существование входных параметров не забывайте проверять (isset($_POST['key'])).
    --- Добавлено ---
    Я в курсе, что jQuery – наше все, но все же...
     
  9. FCSM

    FCSM Новичок

    С нами с:
    11 апр 2017
    Сообщения:
    9
    Симпатии:
    0
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.929
    Симпатии:
    1.564
    если на Vanilla, то как-то так: https://jsfiddle.net/xgmbj0j8/. preventDefault можно убрать, это я здесь, поскольку мне не надо, чтобы что-то сабмитилось в этом примере
     
  11. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    А цикл for там зачем?
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.929
    Симпатии:
    1.564
    Метод forEach не всеми браузерами поддерживается.
     
  13. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    да я не понял что там делается циклом.
     
  14. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.929
    Симпатии:
    1.564
    @keren, супер-пупер-форм может быть несколько. Без jQuery установить обработчик сразу для всех можно только циклом, насколько мне известно. Умеешь без - опубликуй свой вариант, мы у тебя поучимся.
     
  15. FCSM

    FCSM Новичок

    С нами с:
    11 апр 2017
    Сообщения:
    9
    Симпатии:
    0
    @mkramer, я тебе в лс написал. Ответь пожалуйста.
     
  16. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    @mkramer Да я поверхностно это изучал, не попадался такой способ.
    У Трепачева вот пример:
    HTML:
    1. <input type="button" id="button" value="Нажмите на кнопку">
    Код (Javascript):
    1. var button = document.getElementById('button');
    2.  
    3. button.addEventListener('click', function() {
    4.     alert('Вы кликнули по кнопке!');
    5. });
     
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.929
    Симпатии:
    1.564
    Это пример с одной кнопкой. А мой пример - с двумя формами, если ты не заметил. И у ТС была задача, чтобы работало с несколькими формами, вот я ему и показал, как это сделать с несколькими формами
     
    #17 mkramer, 15 янв 2018
    Последнее редактирование: 15 янв 2018
    keren нравится это.