Ребят, всем привет. Решил защитить форму сайта от спама и нашёл в интернете интересный способ, который меня устроил. Суть способа : В форму, которую нужно защитить от спама, нужно добавить вот это HTML: <input id="check" name="check" type="hidden" value="" /> Потом в кнопку, которая отправляет сообщение, нужно добавить это Код (Javascript): onclick="document.getElementById('check').value = 'secretcode';" И в PHP обработчик, нужно добавить вот это PHP: if ($_POST['check'] != 'secretcode') exit('Spam decected'); На одном сайте, я это всё добавил и всё замечательно работает. Но появилась необходимость добавить на другой сайт и появилась проблема. Нормально работает только одна из форм, а при попытке отправить сообщение с других форм, появляется пустая страница с надписью - "Spam decected", и сообщение не отправляется. В чём может быть причина ?
Смотри в консоли браузера, может быть где-то что-то не так оформил раз работает в другом месте. Скорее всего онклик не срабатывает и не меняет валъю.
спопсоб не идеальный... причем не будет работать при сабмите формы не через кнопку а например по нажатию на Enter
Ну так а откуда обработчик знает, какой secretcode нужно сравнивать с отправленным? Сгенерированный secretcode нужно, наверное, где-то сохранять при каждой новой генерации и потом уже сравнивать текущий с отправленным - вот логика CSRF защиты.
Так он походу постоянный собирается использовать --- Добавлено --- @FCSM, хотя бы периодически его меняйте, но не единовременно, как вам было написано на киберфоруме. --- Добавлено --- Вот пользователь удивится, если у него отключен JS. А, чЁ, у всех всегда включен?! Ну я к примеру иногда отключаю JS и забываю потом сразу включить. --- Добавлено --- Проверка при использовании «двухэтапного устаревания» делается примерно так: Код (Text): if ($_POST['key']==$newkey||$_POST['key']==$oldkey&&time()<strtotime($expire)) echo 'OK';
Лучше на onsubmit И не по ID, а искать элемент прямо в форме, чтоб универсально было. Сейчас же большая часть сайтов с отключённым JS перестаёт работать сразу --- Добавлено --- Особенно с ростом популярности всяких Angular, VueJs, React и пр.
P.S. И существование входных параметров не забывайте проверять (isset($_POST['key'])). --- Добавлено --- Я в курсе, что jQuery – наше все, но все же...
если на Vanilla, то как-то так: https://jsfiddle.net/xgmbj0j8/. preventDefault можно убрать, это я здесь, поскольку мне не надо, чтобы что-то сабмитилось в этом примере
@keren, супер-пупер-форм может быть несколько. Без jQuery установить обработчик сразу для всех можно только циклом, насколько мне известно. Умеешь без - опубликуй свой вариант, мы у тебя поучимся.
@mkramer Да я поверхностно это изучал, не попадался такой способ. У Трепачева вот пример: HTML: <input type="button" id="button" value="Нажмите на кнопку"> Код (Javascript): var button = document.getElementById('button'); button.addEventListener('click', function() { alert('Вы кликнули по кнопке!'); });
Это пример с одной кнопкой. А мой пример - с двумя формами, если ты не заметил. И у ТС была задача, чтобы работало с несколькими формами, вот я ему и показал, как это сделать с несколькими формами