Captcha (капча или каптча) - замена стандартной на свою настраиваемую

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

legko
legko
Репутация: 5
Сообщения: 2
Зарегистрирован: 12.04.2017
С нами: 6 лет 11 месяцев

Сообщение #1 legko » 12.04.2017, 09:57

Народ жалуется на спам-ботов, которые с легкостью распознают стандартную каптчу и пишут непотребные сообщения
Предлагаю свое решение по замене стандартной каптчи
Screenshot.png
Пример каптчи

Screenshot (1).png

1. В коне сайта в папке captcha удаляем все файлы, которые там есть
2. Создаем в папке captcha папку fonts, в нее помещаем шрифты, которые будут использованы при генерации Вашей каптчи.
Шрифты обязательно должны быть с TrueType с раширением .ttf
Шрифтов может быть несколько (сколько угодно) и буквы для каптчи будут браться рандомно (случайно) из каждого шрфта
В общем поиграетесь - поймете - тут все просто.
3. В папку captcha кладем (создаем) файл .htaccess следующего содержания:

Код: Выделить всё

Order Deny,Allow
Deny from all

<Files image.php>
    Order Allow,Deny
    Allow from all
</Files>

4. В папку captcha кладем (создаем) файл image.php следующего содержания:

Код: Выделить всё

<?php
   if (!empty($_SERVER['HTTP_USER_AGENT'])) {
      session_name(md5($_SERVER['HTTP_USER_AGENT']));
   }
   session_start();

 $width = 130;                   //Ширина изображения
 $height = 60;                    //Высота изображения
 $font_size = 16;                //Размер шрифта
 $let_amount = 4;               //Количество символов, которые нужно набрать
 $fon_let_amount = 200;     //Количество символов, которые находятся на фоне
 $path_fonts = 'fonts/';       //Путь к шрифтам
 
 
$letters = array('a','b','c','d','e','f','g','h','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','2','3','4','5','6','7','9');  //Символы, используемые в каптче
 $colors = array('10','30','50','70','90','110','130','150','170','190','210'); //Цвета используемые в каптче
 
 $src = imagecreatetruecolor($width,$height);
 $fon = imagecolorallocate($src,255,255,255);
 imagefill($src,0,0,$fon);
 
 $fonts = array();
 $dir=opendir($path_fonts);
 while($fontName = readdir($dir))
 {
   if($fontName != "." && $fontName != "..")
   {
     $fonts[] = $fontName;
   }
 }
 closedir($dir);
 
 for($i=0;$i<$fon_let_amount;$i++)
 {
   $color = imagecolorallocatealpha($src,rand(0,255),rand(0,255),rand(0,255),100);
   $font = $path_fonts.$fonts[rand(0,sizeof($fonts)-1)];
   $letter = $letters[rand(0,sizeof($letters)-1)];
   $size = rand($font_size-2,$font_size+2);
   imagettftext($src,$size,rand(0,45),rand($width*0.1,$width-$width*0.1),rand($height*0.2,$height),$color,$font,$letter);
 }
 
 for($i=0;$i<$let_amount;$i++)
 {
   $color = imagecolorallocatealpha($src,$colors[rand(0,sizeof($colors)-1)],$colors[rand(0,sizeof($colors)-1)],$colors[rand(0,sizeof($colors)-1)],rand(20,40));
   $font = $path_fonts.$fonts[rand(0,sizeof($fonts)-1)];
   $letter = $letters[rand(0,sizeof($letters)-1)];
   $size = rand($font_size*2.1-2,$font_size*2.1+2);
   $x = ($i+1)*$font_size + rand(4,7);
   $y = (($height*2)/3) + rand(0,5);
   $cod[] = $letter;   
   imagettftext($src,$size,rand(0,15),$x,$y,$color,$font,$letter);
 }

$_SESSION["captcha_code"] = implode('',$cod);
 
 header ("Content-type: image/gif");
 imagegif($src);
?>


5. В папке design/default/html (или из вашей темы), в файлах .tpl, там где нужно использовать каптчу, к примеру в файле feedback.tpl, ищем следующий код:

Код: Выделить всё

{if $settings->captcha_feedback}
                     <div class="col-xs-12 col-lg-6 form-inline m-b-1-md_down">
                        {* Изображение капчи *}
                        <div class="form-group">
                           <img class="brad-3" src="captcha/image.php?{math equation='rand(10,10000)'}" alt="captcha" title="captcha"/>
                        </div>

                        {* Поле ввода капчи *}
                        <div class="form-group">
                           <input class="form-control" type="text" name="captcha_code" value="" data-format="\d\d\d\d\d" data-notice="{$lang->form_enter_captcha}" data-language="{$translate_id['form_enter_captcha']}" placeholder="{$lang->form_enter_captcha}*"/>
                        </div>
                     </div>
                  {/if}


и заменяем его на следующий:

Код: Выделить всё

{if $settings->captcha_feedback}
                     <div class="col-xs-12 col-lg-6 form-inline m-b-1-md_down">
                        {* Изображение капчи *}
                        <div class="form-group">
                           <img class="brad-3" src="captcha/image.php" alt="captcha" title="captcha"/>
                        </div>

                        {* Поле ввода капчи *}
                        <div class="form-group">
                           <input class="form-control" type="text" name="captcha_code" value=""  data-notice="{$lang->form_enter_captcha}" data-language="{$translate_id['form_enter_captcha']}" placeholder="{$lang->form_enter_captcha}*"/>
                        </div>
                     </div>
                  {/if}


Вот, собственно и все
Все настройки каптчи (размер, кол-во символов, цвета и т.д) находятся в файле captcha/image.php

Пользуйтесь на здоровье

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #2 korshunov » 12.04.2017, 11:04

Весьма хорошая разработка.

Применяю для стандартного шрифта. Немного поменял настройки на

$fon_let_amount = 20; //Количество символов, которые находятся на фоне
$let_amount = rand(3,5); //Количество символов, которые нужно набрать
$width = 25*$let_amount; //Ширина изображения

и вывод
$x = intval($i*($width-6)/$let_amount + rand(4,7));


Выходит очень симпатично...

pedro
pedro
Репутация: 1
Сообщения: 20
Зарегистрирован: 31.03.2016
С нами: 7 лет 11 месяцев

Сообщение #3 pedro » 12.04.2017, 21:53

Еще бы мануал как добавить капчу в форму обратного звонка)

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #4 Vitaly » 13.04.2017, 18:39

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

Встречал в инете примеры и других ловушек подобного принципа. Например в любое скрытое поле вставляем кодовое слово посредством JS. А на сервере проверяем. Метод опирается на то, что подавляющее большинство ботов не умеет работать с JS.

dimitriy
Аватара
dimitriy
Репутация: 4
Сообщения: 92
Зарегистрирован: 26.06.2016
С нами: 7 лет 9 месяцев

Сообщение #5 dimitriy » 15.04.2017, 12:26

Поделитесь решением по обратному звонку, будьте так добры. Я даже удалил полностью эту форму, удалил все из кода, удалил callback.tpl - а все равно спам приходит на обратный звонок.. чудеса да и только(



Vitaly писал(а):После установки движка начался дикий спам в форму обратного звонка.
Вспомнил, что когда-то делал очень простой, в несколько строк плагин-антиспам для джумлы.
Работает как ловушка для ботов. В форму добавляется скрытое но лакомое для роботов поле (например "email" в форму обратного звонка). Если поле заполнено, то пользователь считается ботом и письмо не уходит.
Применил этот подход в нынешнем магазине, и проблема пропала. Есть огромный плюс в этом методе - никакой надоедливой капчи для клиента и минимум кода для вас.

Встречал в инете примеры и других ловушек подобного принципа. Например в любое скрытое поле вставляем кодовое слово посредством JS. А на сервере проверяем. Метод опирается на то, что подавляющее большинство ботов не умеет работать с JS.

trainracing M
Аватара
trainracing M
Возраст: 31
Репутация: 13
Сообщения: 121
Зарегистрирован: 07.10.2016
С нами: 7 лет 5 месяцев
Сайт

Сообщение #6 trainracing » 17.05.2017, 14:15

Как сделать капчу на обратный звонок?

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #7 makki » 18.05.2017, 07:58

С выходом 2-й версии движка, теперь перед тем как задавать вопрос, лучше уточнять какая у вас версия движка, поскольку решение зачастую не подходит для обоих версий.

Сам столкнулся со спамом в Заказе обратного звонка.
Предлагаю вместо надоедливой каптчи, использовать невидимую защиту от спама, основанную на том, что спам-боты не умеют работать с javascript.

Решение для OkayCMS 2.0
1) файл design/ваш шаблон/html/callback.tpl
1.1) После строки <form id="fn_callback" class="popup fn_validate_callback" method="post">, добавляем скрытый input c id="check"

Код: Выделить всё

<input id="check" name="check" type="hidden" value="">

1.2) в строке отправки формы добавим

Код: Выделить всё

onclick="document.getElementById('check').value='BNcA5P4jajA6tkdqon7PcuFqhwaH50XU';"

Должно получиться так:

Код: Выделить всё

<input class="button" type="submit" name="callback" onclick="document.getElementById('check').value='BNcA5P4jajA6tkdqon7PcuFqhwaH50XU';" data-language="{$translate_id['callback_order']}" value="{$lang->callback_order}">

Здесь BNcA5P4jajA6tkdqon7PcuFqhwaH50XU - это произвольная строка, которую позже мы будем проверять на стороне сервера. Если ее меняете тут, не забудьте потом поменять в php файле.
2) Файл view/IndexView.php
После строки

Код: Выделить всё

            } elseif(!$this->validate->is_comment($callback->message)) {
                $this->design->assign('call_error', 'empty_comment');

Добавьте

Код: Выделить всё

            } elseif($_POST['check'] != 'BNcA5P4jajA6tkdqon7PcuFqhwaH50XU') {
               $this->design->assign('error', 'spam_detected');
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

trainracing M
Аватара
trainracing M
Возраст: 31
Репутация: 13
Сообщения: 121
Зарегистрирован: 07.10.2016
С нами: 7 лет 5 месяцев
Сайт

Сообщение #8 trainracing » 18.05.2017, 14:02

Спасибо, попробую)

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #9 korshunov » 18.05.2017, 14:54

Способ не очень хорош, точнее, совсем не хорош. Так как в результате получится, что если посетитель заполнит поля, и отправит форму нажатием на ENTER, а не на кнопку, получение отзыва НЕ СРАБОТАЕТ.

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

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #10 makki » 18.05.2017, 19:32

korshunov писал(а):Способ не очень хорош, точнее, совсем не хорош. Так как в результате получится, что если посетитель заполнит поля, и отправит форму нажатием на ENTER, а не на кнопку, получение отзыва НЕ СРАБОТАЕТ.
Эта форма в любом случае и без этого дополнения не отправляется клавишой ENTER
korshunov писал(а):И еще один момент. Любой хакер-новичок, прочитавший хоть начальный мануал по отправке форм, обнаружив на сайте предлагаемую доработку, сможет легко завалить Ваш сайт спамом.
Предложите лучший вариант.
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #11 korshunov » 19.05.2017, 06:09

У меня на http://www.demookay.com/ прекрасно отправляется форма (Перезвоните мне) при нажатии на Enter. Это стандарт при отправке форм, это удобно и эту возможность редко кто отключает.

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #12 makki » 21.05.2017, 19:14

korshunov писал(а):Способ не очень хорош, точнее, совсем не хорош. Так как в результате получится, что если посетитель заполнит поля, и отправит форму нажатием на ENTER, а не на кнопку, получение отзыва НЕ СРАБОТАЕТ.
Из чего вы решили, что форма не должна отправляться? Из-за onclick?

Короче метод роботает и форма отправляется и нажатием Enter.

Еще, как выше рекомендовали, можно добавить скрытое поле email

Код: Выделить всё

<input name="email" type="hidden" value="">

а в IndexView.php добавить проверку

Код: Выделить всё

            } elseif($_POST['email'] != '') {
               $this->design->assign('error', 'spam_detected');
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #13 korshunov » 22.05.2017, 06:09

Теперь у Вас новый момент, вместо конкретного ответа, появляется вопрос:
makki писал(а):Из чего вы решили, что форма не должна отправляться? Из-за onclick?
Вопрос некорректный, ибо я нигде не писал, что "форма не должна отправляться". Более того, я как раз заявлял, что она именно отправляется клавишей ENTER, а Вы утверждали сначала "Эта форма в любом случае и без этого дополнения не отправляется клавишой ENTER".

И непонятно, зачем еще усложнять метод дополнением нового поля, если, как Вы пишете, "Короче метод роботает"...

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

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #14 makki » 22.05.2017, 06:24

Сначала я действительно увидел что форма не отправляется клавишей Enter, хотя никак не мог понять как это связано с моей доработкой. А потом понял, что это связано с стандартной поверкой поля "phone".

Добавил ещё один метод проверки, потому что тот защищает от спама, но иногда пропускает. Сам пока экспериментирую. С двумя полями пока спама нет. В любом случае это лучше чем каптча.
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

trainracing M
Аватара
trainracing M
Возраст: 31
Репутация: 13
Сообщения: 121
Зарегистрирован: 07.10.2016
С нами: 7 лет 5 месяцев
Сайт

Сообщение #15 trainracing » 14.06.2017, 08:19

makki писал(а):Сначала я действительно увидел что форма не отправляется клавишей Enter, хотя никак не мог понять как это связано с моей доработкой. А потом понял, что это связано с стандартной поверкой поля "phone".

Добавил ещё один метод проверки, потому что тот защищает от спама, но иногда пропускает. Сам пока экспериментирую. С двумя полями пока спама нет. В любом случае это лучше чем каптча.

а что за новый метод? поделитель плз для 1.2.4

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #16 makki » 14.06.2017, 09:19

trainracing писал(а):а что за новый метод? поделитель плз для 1.2.4
Выше на 2 поста этот метод описан с добавлением скрытого поля email.

Но я добавил еще одну проверку. Обычно в спаме всегда есть ссылки. Вот мы и проверяем, если в поле сообщения есть "http", значит спам.
Для этого
1) в файле IndexView.php после строки

Код: Выделить всё

$callback->message      = $this->request->post('message');

добавляем

Код: Выделить всё

$pos = stripos($callback->message, 'http');

2) И в том же файле чуть ниже в валидации данных клиента добавляем новое условие

Код: Выделить всё

} elseif($pos !== false) {
               $this->design->assign('error', 'spam_detected');


Прошло три недели, спама небыло.
Инструкция для OKAYCMS 2. Но скорее всего подойдет для 1.2.4
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

trainracing M
Аватара
trainracing M
Возраст: 31
Репутация: 13
Сообщения: 121
Зарегистрирован: 07.10.2016
С нами: 7 лет 5 месяцев
Сайт

Сообщение #17 trainracing » 20.06.2017, 16:02

makki писал(а):
trainracing писал(а):а что за новый метод? поделитель плз для 1.2.4
Выше на 2 поста этот метод описан с добавлением скрытого поля email.

Но я добавил еще одну проверку. Обычно в спаме всегда есть ссылки. Вот мы и проверяем, если в поле сообщения есть "http", значит спам.
Для этого
1) в файле IndexView.php после строки

Код: Выделить всё

$callback->message      = $this->request->post('message');

добавляем

Код: Выделить всё

$pos = stripos($callback->message, 'http');

2) И в том же файле чуть ниже в валидации данных клиента добавляем новое условие

Код: Выделить всё

} elseif($pos !== false) {
               $this->design->assign('error', 'spam_detected');


Прошло три недели, спама небыло.
Инструкция для OKAYCMS 2. Но скорее всего подойдет для 1.2.4



ваш мето помог, но спам с адресом bit.ly проходит((( как bit.ly добавить тоже правильно?

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #18 makki » 20.06.2017, 16:28

1) IndexView.php

Код: Выделить всё

$pos1 = stripos($callback->message, 'bit.ly');

2)

Код: Выделить всё

} elseif($pos1 !== false) {
               $this->design->assign('error', 'spam_detected');
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 7 лет 7 месяцев

Сообщение #19 Vitaly » 21.06.2017, 15:34

Что бы там кто не говорил, а у меня метод со скрытым полем, на обратном звонке уже около 10-ти месяцев работает, и ни одного ложного срабатывания за это время. До того было 5-10 в день.
Хакер то конечно раскусит, но без этого ему вообще напрягаться не нужно. А так хоть обычных ботов фильтрует.
Капча наверное будет более надежной защитой, но она всех раздражает, а если хакеру нужно вас заспамить, то и капча не особо поможет.
К тому-же есть куча сервисов, где сидит армия бездельников и набивает эту капчу для ботов, за три копейки, круглые сутки.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #20 korshunov » 22.06.2017, 06:28

Vitaly писал(а):Что бы там кто не говорил, а у меня метод со скрытым полем, на обратном звонке уже около 10-ти месяцев работает, и ни одного ложного срабатывания за это время

У меня аналогично, разные простенькие способы, на порядок легче капчи, весьма эффективно останавливают спам. Я полагаю, просто сказывается отличие от массово применяющихся средств.


Название раздела: Полезные решения для OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Полезные решения для OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 10 гостей