The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Средство против роботов публикующих спам в формах
Избавится от автоматического поста и не напрягать посетителя с вводом
 графического кода позволит следующий алгоритм:

# Антиробот - против автопостов                 #
function antibot($text)
    {
    $text = substr($text, 1, -4);
    $sear = array("'1'i","'2'i","'3'i","'4'i","'5'i","'6'i","'7'i","'8'i","'9'i","'0'i");
    $repl = array("a","b","c","d","e","f","g","h","i","j");
    $text = preg_replace ($sear, $repl, $text);
    return $text;
    }
/*
    // вставляем анти-робоспам
    $antitime = time();
    $antiname = antibot($antitime);
    echo '<input name="'.$antiname.'" type="hidden" value="'.$antitime.'">';
    #----------
    // проверяем анти-робоспам
    $ver1time = time();
    $ver2time = time()-'9999';
    $ver1name = antibot($ver1time);
    $ver2name = antibot($ver2time);
    if ((strip_tags($_POST[$ver1name])<$ver1time and strip_tags($_POST[$ver1name])>$ver2time) or
        (strip_tags($_POST[$ver2name])<$ver1time and strip_tags($_POST[$ver2name])>$ver2time))
        {
        $antibot = '1';   // антибот даёт добро на post
        } else {
        $antibot = '-1';   // антибот запрещает этот post
        }
*/

PS: в функции "замена цифры на буквы" обязательно замените a-j на что-нибудь своё.
PPS: Код успешно работает около двух лет на нескольких сайтах.
 
09.07.2006 , Автор: Олег Светлов
Ключи: spam, web, php / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / PHP / Серверная часть и интерпретатор

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, qa (?), 08:37, 14/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Скорее защита от обычных посетителей.
    Код не рабочий, алгоритм ужасен.

    Переменным c именами $ver1name и $ver2name просто не откуда взяться, когда $ver1time != $antitime || $ver2time != $antitime - 9999.

     
     
  • 2.2, qa (?), 08:39, 14/07/2006 [^] [^^] [^^^] [ответить]  
  • +/
    Под переменными имелись в виду ключи в массиве $_POST. Т.е. $_POST[$ver1name] и $_POST[$ver2name]
     

  • 1.3, XAnder (ok), 09:26, 14/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Принцип понятен и идея имеет право на существование. Но приведенная программа бесполезна при массовом использовании - спамеры быстро подстроятся под этот алгоритм. Научится "угадывать" буквы в функции antibot не составит особого труда.

    С другой стороны велосипед изобретать не надо было - достаточно воспользоваться какой-нибудь стандартной hash-функцией, например так:

    define("ANTIBOT_JUNK", "K-Hj/|786~*6g8&^&"); // случайный мусор - как рука на клаву ляжет :)
    ...
    function antibot($text)
    {
    $text = substr($text, 1, -4);
    return md5($text . ANTIBOT_JUNK);
    }

     
  • 1.4, Олег автор (?), 21:07, 19/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Главное - работает.
    А подбирать алгоритм под каждый не самый значительный сайт - с дуба рухнешь. Ием более, что усложнить оное - как два пальца...

    PS: кто не хочет - не пользует. кто хочет - пусть улучшает.

     
  • 1.5, Effect (?), 02:43, 20/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Этот код всеголиш немного усложнит задачу.
    ничего угадывать ненадо, надо просто пропарсить страницу и выдрать значение нужного поля.
    если копать в сторону WWW:Mehcanize (perl) через LWP немного больше телодвижений

    делается элементарно

    1. парсим страницу и ищем <input какой нам нужен
    2. заполняем поля
    3. отсылаем форму


    лично у меня создание бота против такой системы заняло бы минут 10-15 (наспор? ;-))

    но коненчо от скрипт-кидсов спасёт.

    если по существу, то систему надо делать из расчета чтобы бот не мог прочитать\запарсить.

    например изменять имена полей (например шифровать а часть ключа передавать в хидден поле)

    либо повесить на крон скрипт который будет менять названия полей раз в день например.

    но пока боты не научились читать картинки - это самая эфективная защита от спама.

     
  • 1.6, Effect (?), 02:51, 20/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    собсно с лёту

    $mech->get( "http://icanspam/here.omg" );
    (my $fieldname,$fieldvalue) = $mech->content() =~ /<some><stuff><input name="(.*)" value="(.*)"><we><can><find>/;

    $mech->field( "username", "spammer" );
    $mech->field( "text", "hahaha i can span hare too ;-()))" );
    $mech->field( $fieldname, $fieldvalue );
    $mech->submit();


    простите что нагадил =(
    очень много негатива, сорвался

     
  • 1.7, XAnder (ok), 15:00, 20/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    2Effect: Это само собой, тут не поспоришь. Бот, который перед тем как гадить, парсит страничку с формой - это зараза, с которой бороться трудно, потому что ведет себя почти как "живой" юзер.

    > например изменять имена полей (например шифровать а часть ключа передавать в хидден поле) либо повесить на крон скрипт который будет менять названия полей раз в день например.

    Не думаю, что это будет эффективно. Собссно, твой же бот уложит такую защиту без проблем.

    Но таких умных ботов пока не густо, в основном всякие тупые (мне попадались), против которых описанная защита в самый раз.

    Картинки, конечно же, дело хорошее, но напрягает. А САМАЯ эффективная защита - бдительный модератор :)

     
  • 1.8, XAnder (ok), 15:07, 20/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Парлон, не доглядел. Твой бот не уложит - нужно немного усовершенствовать, а именно найти в форме еще элемент textarea, взять его имя и подставить сюда вместо "text":

    > $mech->field( "text", "hahaha i can span hare too ;-()))" );

    Аналогично с "username".

    Вот теперь уложит на ура ;)

     
  • 1.10, Effect (?), 16:26, 20/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    както гнусно с кодировкой вышло ;-)
    > $mech->field( "text", "hahaha i can span hare too ;-()))" );
    Это особенность модуля WWW::Mechanize

    эта строчка значит "найти поле с именем text и вписать туда ...."

    имена этих полей не меняются же,на сколько я понял?

    даже если изменяются это всего одна лишняя строчка на поле, не суть важно


    я говорил про вот про что:

    давным давно вел ресурс с аккордами, и всякие гады любили тырить аккорды для своих сайтов


    решение которое я пытался в тот момент сделать - изменение html документа, тоесть раз в nчасов скрипт изменял бы структуры документа
    например <br><b> на <b><br>

    <div><br> на <p> итд

    в зависимости от структуры документа, т.е. визуально все остается как есть а вот структура документа меняется.


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

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

    или например через <table cо страшной структурой

    ну еще можно фейк поля добавить к примеру


    оснавная идея сделать текст код нечитаемым для бота

    вообщем вариантов есть много ;-)


    вчера задумался над созданием фрейморка на эту тему ;-)
    если кому интересно пишите, можно попробовать склепать

     
  • 1.11, Effect (?), 18:00, 20/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Не думаю, что это будет эффективно. Собссно, твой же бот уложит такую защиту без проблем.

    ну незнаю, пример

    <input name="sghgHJGHJsh"
    ..name="sjkjlKJKklks"
    ..name="sjkjaiioasas"
    ..name="skGHGsghjGSh"
    ..name="checksum" value="mMSjHSJhsjHJShjshjs"

    типо поля формы
    проверка типо
    md5(field1 + field2 + field3 + field4 + salt) должна быть равна checksum

    это раз, + перемешивать поля местами

    тоесть отображается у нас в таком порядка

    name
    mail
    subject

    мы постоянно меняем из местами (тэги)

    тоесть при каждой загрузке страници они будут в разном порядке


    а отображать на экране через стайл, указывая координаты
    (относительные, причем вынести в css во внешний файл, ну еще можно от разных элементов расчитывать. хм, уже параноя =))

    а сами поля шифровать шлючом так:

    имяполя_мусор
    где мусор например тотже тайм
    + надо обязательно сделать проверку на время
    ну или просто менять ключи раз в день\nчасов


    если у кого есть идеи на тему антибота пишите, буду рад ;-)

     
  • 1.12, XAnder (ok), 19:47, 20/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    2 Effect: [восхищенно] АБАЛДЕТЬ!!! Идеи - класс, закидоны - тоже :)

    Идея "супербота": бот берет страницу с формой, парсит ее полностью, с построением дерева DOM. Находит все формы, откидывает те, которые не содержат тегов <textarea>. Остальные - его клиенты. Честно заполняет все незаполненные по умолчанию поля формы, пихая свой гнусный спам в тот самый textarea. И отсылает форму.

    На name'ы полей не смотрит вообще, какие есть, такие и отправляет! О назначении полей догадывается исключительно по виду тегов.

    Весьма вероятно, что если народ начнет массово внедрять самописные антиботы, то такие "суперботы" непременно скоро появятся. А может и уже появились.

    Как с такими бороться без JavaScript, я не понял.

     
  • 1.13, Effect (?), 20:32, 20/07/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    2XAnder ну да, люблю параноить по вечерам но всетаки, если перемешивать поля ... большой текст свёрнут, показать
     
     
  • 2.14, Олег автор (?), 23:54, 27/07/2006 [^] [^^] [^^^] [ответить]  
  • +/
    > либо повесить на крон скрипт который будет менять названия полей раз в день например
    В скрипте, собственно, название полей меняется по части time(), так вроде проще :), т.е. раз в несколько часов.

    Усложнение я подразумевал не в сторону хэшей - так и самому не трудно запутаться :). Гараздо эффективнее использовать java-scrips (код печатания скрипта рандомом чуть меняется + в соотсветсвии с тем же time() ). В таком случае робот-сборщик не отпарсит текст.
    Конечно, если прибавить разбитый на части хэш - это большой плюс к защите.

    Ещё раз повторю: для супер-пупер-ресурса такая защита слабовата. В приведённом мной первоначальном варианте - для малых сайтов. В доработанном в ветке - вполне годиться для для среднего и чуть выше уровня.

     

  • 1.15, kyprizel (??), 22:15, 09/08/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    идея мертвая. тогда уж на js добавлять поле можно, но - боты уже и js понимают :)
     
  • 1.16, AnyKey (?), 14:53, 15/08/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Очень хочу посмотреть на бота, понимающего JS.
     
     
  • 2.19, kostich (?), 02:03, 12/09/2006 [^] [^^] [^^^] [ответить]  
  • +/
    Этот бот называется IE. Заполнить формы из проги на VC очень элементарно, что бы вызвать клик надо конечно покурить доки, но это все решаемо.

    Можно даже сделать JS интерпретатор, т.е. встроить IE в какую-то прогу аля сервер, которая будет в IE грузить JS вместе с документом, а потом вызывать клик... ничего заполнять не надо по сути. Далее это всё прогоняем через простейшую проксю, которая подставит в нужные филды нужные значения.

    JS VM в природе есть, но оно как-то не совсем универсально, от них очень просто защиться, т.к. все в совокупности называется браузером, а грузить какие-то куски кода без самого документа не имеет смысла, т.к. JS к этому документу может быть привязан.

    Под юнихами наверное просто, на базе какого-то епенсоурц браузера, не смотрел просто. Кликеры на базе IE видел... но там тоже не всё так просто, т.к. если форм на странице несколько, то надо как бы сообщать какую форму кликать, а если в JS проверяется заполнение текста, то скатываемся к первому абзацу.

     

  • 1.17, sekrett (?), 02:26, 21/08/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я лично нашел более простое решение: добавил проверку всех полей на содержание трех слов: www, http и href, плюс кодирование тегов в lt, gt. Если спам, то обязательно ссылка на сайт, ИМХО.
     
  • 1.18, Серега (?), 08:19, 22/08/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    У меня есть отработанная функция, которая экранирует нужные символы, заменяет на &-последовательности и режет по длине (это что бы от сообщения в одно слово весь сайт не разъехался). А на форме пользователя прошу ввести текущий день недели :) спам робота написать легко, но стоит ли заморачиваться... кроме того юзера можно попросить что-нибудь осмысленное написать (буква, слово)
     
  • 1.20, blackdog (?), 19:25, 26/09/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    генерим число , пихаем в базу
    в hidden input id записи
    + картинка с числом для ввода руками
     
     
  • 2.23, Nikitian (?), 14:49, 10/07/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >генерим число , пихаем в базу
    >в hidden input id записи
    >+ картинка с числом для ввода руками


    Лучше не напрягать бд лишний раз (имхо). При приходе пользователя стартуем сессию и в сессии сохраняем некоторое число. После каждого сабмита можно число генерить заново. Пользователь число не увидит, а сервер может его использовать и будет уверен, что число принадлежит только одному посетителю. Сам недавно реализовал подобное вместо хидденполя (в нём просто хранил функцию от числа).
    +

     

  • 1.21, Иван (??), 14:35, 30/09/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А почему картинку с цифрами не хотите?
    Самый простой и, имхо, действеный метод.

    В принципе, если чуть-чуть напрячься, можно и без
    гд обойтись: (первое что пришло в голову)
    1.Например заготовить символы заранее и обозвать их неосмысленно. (совсем пошло)
    2. (img src="genimg.php"...). а генимг собирает картинку из готовых кусков. (чуть веселее)
    Криво, но работать будет.

    Да мало ли фантазии. Главное задаться целью, а средств можно придумать много.

     
  • 1.22, Иван (??), 14:38, 30/09/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    И вообще, чем больше разных средств на разных сайтах, тем сложнее писать универсального робота ;)
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру