Форма заявки с сайта

Защита от спама PHP формы отправки данных

Реклама — двигатель прогресса. Рекламодатели постоянно ищут все новые способы рекламы своих товаров и услуг. Поэтому не исключено, что через вашу форму будут рассылать СПАМ — так называемый вид рекламной рассылки.

Как защитить форму от отправки таких данных. 100% защиты не может быть, так как никто никогда не запрещает заполнить вашу форму вручную. Но все же мы можем защитить ее от роботов (программ), которые могут отправлять сотни сообщений в секунду.

Создание скрытого поля с шифром при помощи PHP

Простейший способ – создание скрытого поля с генерацией в нем набора спец символов.

Прежде всего, мы добавляем в форму скрытое поле.

То есть в это поле подставляется переменная $zaschita, которую мы должны сгенерировать заранее. Это сделаем следующим образом:

Мы шифруем время запуска формы и имя ivan. Получается, что каждую секунду данная переменная будет изменена, а алгоритм шифрования известен только вам. Вы можете использовать любой другой метод шифрования или использовать набор любых символов вместо ivan. Для того, чтобы обойти такую защиту в вашей форме потребуется разгадать метод шифрования. Поверьте – это возможно, но на это потребуется некоторое время. И, если это произошло, и защита PHP формы отправки данных на почту не работает, то вы всегда можете поменять шифр.

Проверка передаваемого шифра на PHP

Со стороны PHP мы должны принять скрытую переменную и проверить ее тем же образом, но при этом нам обязательно нужно создать новую переменную и зафиксировать в ней время загрузки формы, иначе наша простейшая защита PHP формы от спама будет работать против нас и не даст пользователю отправить сообщение. Для этого создаем переменную, также шифруя ее:

Читайте также:  Html команды для таблиц

Затем прикрепляем переменную при помощи GET массива.

После этого нам нужно при отправке формы сформировать шифр и сравнить его с тем, который передан нам в скрытом поле.

$pol_time = $_GET['p']; $vernii_shifr = md5($pol_time."ivan"); $pol_shifr = $_POST['zf'];

Сравниваем их. Если совпадают, то отправляем данные на почту, иначе выводим сообщение:

If($vernii_shifr == $pol_shifr) < …. код отправки письма …. >else

Таким образом, полный код PHP формы с защитой от спама выглядит следующим образом:

      " method="post">  "> else < $pol_time = $_GET['p']; $vernii_shifr = md5($pol_time."ivan"); $pol_shifr = $_POST['zf']; If($vernii_shifr == $pol_shifr)< $fio = $_POST['fio']; $email = $_POST['email']; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $fio = trim($fio); $email = trim($email); if (mail("to@email.ru", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: ot@email.ru \r\n"))< echo "Сообщение успешно отправлено"; >else < echo "При отправке сообщения возникли ошибки"; >> else < echo "Не нужно здесь спамить"; >> ?> 

Попробуйте посмотреть исходный код данного скрипта в браузере и обновляйте его каждую секунду – вы увидите, что ключи постоянно меняются.

Теперь предлагаю усложнить защиту, т.е. добавить головной боли для спамеров.
Для этого можно создать динамическую переменную в скрытом поле:

$t1 = substr(time(), 9, 1); $t2 = substr(time(), 7, 1); $t3 = substr(time(), 8, 1); $t_vse = $t1+$t2+$t3;

Например текущее время «1547380408». При помощи скрипта мы берем 10-й, 7-й и 8-й символы и просто их складываем, получая переменную $t_vse.
Далее нужно передать еще одним скрытым полем текущее время,вместо GET запроса, предварительно зашифровав его с возможностью расшифровки:

$kluch = '3287987984'; $shifruem = time(); $kript = mcrypt_create_iv( mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM ); $shifr = base64_encode( $kript . mcrypt_encrypt( MCRYPT_RIJNDAEL_128, hash('sha256', $kluch, true), $shifruem, MCRYPT_MODE_CBC, $kript ) );
$rsh = $_POST['d']; $dannie = base64_decode($rsh); $kript = substr($dannie, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); $nashe_vremya = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, hash('sha256', $kluch, true), substr($dannie, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)), MCRYPT_MODE_CBC, $kript ), "\0" ); $vernii_shifr = md5(md5($nashe_vremya)."ivan"); $t1 = substr($nashe_vremya, 9, 1); $t2 = substr($nashe_vremya, 7, 1); $t3 = substr($nashe_vremya, 8, 1); $t_vse = $t1+$t2+$t3; $z = 'z_'.$t_vse; $pol_shifr = $_POST[$z];

Здесь мы воссоздаем, расшифровывая данные, переменную z_<число>, затем получаем наш первый шифр и сверяем его. Таим образом защита от спама PHP формы была усилена и позволит не использовать поля для ввода символов и т.п., что отпугивает пользователей.
Полный исходный код нашей PHP формы отправки данных с защитой от спама выглядит следующим образом:

         " value=""> "> else < $rsh = $_POST['d']; $dannie = base64_decode($rsh); $kript = substr($dannie, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); $nashe_vremya = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, hash('sha256', $kluch, true), substr($dannie, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)), MCRYPT_MODE_CBC, $kript ), "\0" ); $vernii_shifr = md5(md5($nashe_vremya)."ivan"); $t1 = substr($nashe_vremya, 9, 1); $t2 = substr($nashe_vremya, 7, 1); $t3 = substr($nashe_vremya, 8, 1); $t_vse = $t1+$t2+$t3; $z = 'z_'.$t_vse; $pol_shifr = $_POST[$z]; if($vernii_shifr == $pol_shifr)< $fio = $_POST['fio']; $email = $_POST['email']; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $fio = trim($fio); $email = trim($email); if (mail("to@email.ru", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: ot@email.ru \r\n"))< echo "Сообщение успешно отправлено"; >else < echo "При отправке сообщения возникли ошибки"; >> else < echo "Не нужно здесь спамить"; >> ?> 

исходный код формы отправки данных на почту

Естественно эту защиту можно обойти, если разгадать данный метод, но на это потребуется немало сил и времени.
На рисунке я представил исходный код в браузере, обратите внимание на два скрытых поля. В первом каждую секунду меняется и шифр и название переменной, во втором просто меняется шифр.

На следующем рисунке отображен исходный код через несколько секунд.

исходный код формы отправки данных на почту

Вы всегда можете использовать Google ReCaptcha для защиты от спама. Это более надежная защита.

А по поводу защиты PHP формы от спама, описанной в данной статье, я предлагаю в комментариях описать возможные способы ее обхода для того, чтобы мы могли ее усложнить и сделать более надежной, при этом не перегружая пользователя лишними и раздражающими действиями. Пока главная проблема здесь в том, что все ключи видны пользователю. Можно хранить закрытые ключи в базе данных или банально в файле и это усложнит задачу взлома для любителей СПАМА.

Источник

Защита формы обратной связи от спама на PHP и JavaScript

Спам не пройдет

Всем привет. Если вы читаете эту статью, то вероятнее всего столкнулись с проблемой, которая выражается в виде спама через форму обратной связи на сайте. К сожалению спама меньше не становится и нужно от этого как-то защищаться. Способы существуют, их несколько, но мы рассмотрим один, на мой взгляд весьма эффективный. Сразу скажу, что не будем привязываться к какому-то конкретному движку, сделаем все своими руками. Прежде, чем писать защиту формы от спама, следует отметить, что в большинстве случаев спам приходит автоматический, это так называемые спам-боты, которые рассылают сообщения на тысячи сайтов. Сканируется сайт на наличие формы обратной связи и если она есть, поля заполняются и тут же идет отправка.

Телеграм-канал serblog.ru

Защита формы от спама. Теория

  • Добавим к форме input с типом hidden и пустым значением (value)
  • По нажатию на кнопку отправки данных формы будем подставлять какое-то значение в скрытый input
  • На стороне сервера примем данные из скрытого инпута
  • Сделаем проверку. Если значение скрытого поля не равно тому, что мы в него передали через JS, то форма отправлена не будет.

Как правило боты не делают нажатие на кнопку отправки и это легко проверить, установив в Яндекс Метрике соответствующие цели. Поэтому такой способ должен защитить сайт от спама если не совсем, то ограничить его поступление до минимума. То есть будут приходить сообщения только если живой человек отправит форму самостоятельно, то есть нажмет на кнопку. Итак, приступим. Добавляем в форму скрытое поле:

Защита контактной формы от спама. Практика

input type="hidden" name="code" value="" id="code"/>

В JavaScript пишем следующее:

let code = document.querySelector('#code'); // Получаем скрытый input document.querySelector('.btn').onclick = function(){ // Клик по кнопке отправки code.value = 'NOSPAM'; // Подставляем значение в value инпута };

let code = document.querySelector(‘#code’); // Получаем скрытый input document.querySelector(‘.btn’).onclick = function()< // Клик по кнопке отправки code.value = 'NOSPAM'; // Подставляем значение в value инпута >;

После клика скрытое поле будет выглядеть примерно так:

input type="hidden" name="code" value="NOSPAM" class="code"/>

Теперь сделаем проверку на PHP.

if ($_POST['code'] != 'NOSPAM') { exit; }

На этом защиту от спама можно было бы завершить, но как быть с движками типа WordPress? Для CMS существует огромное количество плагинов по защите от различного рода взломов, атак и спама, но при желании можно внедрить и этот способ, но это тема для отдельной статьи или целого видео-урока. Возможно в ближайшее время я выпущу материал на эту тему. А какие способы защиты от спама знаете вы?

Читайте также:

Форма обратной связи для заинтересованного посетителя с возможностью обратного звонка. В сети есть примеры платные и бесплатные, рабочие и не рабочие — устаревшие.Часто на одностраничниках, и на моей странице тоже стоят такие ФОС. Хотелость бы иметь современную ФОС без использования БД. Особенно интересно создать скрипт комментариев с возможностью редакции на таком же одностраничнике. В сети есть аналог такого комментария, но всего ОДИН! Привлекать сторонние сервисы со своими скриптами, это их реклама и потеря веса. Хотя, я пользуюсь и этим на своих одностраничниках. Всё дело в том, что ряд моих страниц уже несколько лет стоят в топ 10 по вч запросам и это ощутимо в вопросах бизнеса. В Google, клиенты, не смотря на раздел МОЙ БИЗНЕС, не проявляют желания писать отзывы. Да, и не умеют. А тут же на странице — пожалуйста. Но нет такой возможности. И ещё такой нюанс, если по вч запросу РЕМОНТ ХОЛОДИЛЬНИКОВ ХАРЬКОВЕ, мой сайт стоит на шестой позиции в поиске Гугла моего региона, заказов 1-2, если вывожу на 3-4 место,
заказов 3-4. Если 1-3 место , заказов море. Поэтому каждое хорошее слово в отзыве играет роль. Извините, написал много, хотел донести.

Интересное решение. Учитывая, что на моей странице 80 000 знаков как бы защитится от текстовых ботов на всякий случай. У Вас была публикация по ограничению по буквам записей на JS. Видимо я и запомнил вашу эту публикацию, что она одна в инете. Спасибо за ваши практики.

когда создавал защиту от ботов на своем сайте, то использовал следующий алгоритм. Язык PHP. 1. Список 1. Массив со списком HTML сущностей, которых легче всего можно спрятать в токене из рандомных символов.
2. Список 2. Массив со списком декодированных HTML сущностей из списка 1.
3. При открытии страницы формируется рандомный токен из символов »&;0123456789&;abcdefghijklmnopqrstuvwxyz&;ABCDEFGHIJKLMNOPQRSTUVWXYZ&;()#%», я использовал сложность 50, т.е. строка на 50 символов.
4. Выбираем случайный элемент из списка 1, и заменяем им случайный символ из токена, предварительно сохранив в сессию НОМЕР_СТРОКИ в токене, в которую мы поместили HTML сущность и НОМЕР_ЭЛЕМЕНТА в массиве списка 1.
5. Помещаем полученный токен в форму на странице.
6. После того, как мы получили токен от формы, получаем соответствующий символ из токена по НОМЕРУ_СТРОКИ и сравниваем его с элементом из списка 2 по НОМЕРУ_ЭЛЕМЕНТА
7. Если они совпадают, значит, форма отправлена человеком.
8. Если нет, значит, форма отправлена роботом.
Принцип защиты основан на том, что браузер всегда декодирует HTML сущности, и одна и та же HTML сущность будет иметь разный вид, в зависимости от того, получена она от браузера или от бота, не использующего браузер.
Пример:
& iexcl; = Бот отправит этот код как есть, состоящий из 7 символов.
¡ = человек отправит этот же код в таком виде. Токен в 50 символов используется, чтобы не было очевидно, что защита основана на принципе отображения браузером HTML сущностей.
Реализовывал эту защиту на разных сайтах, которые жаловались на спам, и хотели защиту без капчи, включая свой собственный сайт. Ни разу боты не прошли эту защиту.

Источник

Оцените статью