php отличить ботов от людей

Discussion in 'PHP' started by GAiN, 7 Oct 2014.

  1. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,550
    Likes Received:
    172
    Reputations:
    99
    встала задача в лог вписывать графу о посещении, обычных поисковых (извесных) ботов определяем регулярным выражением.
    я не о поисковых ботах, а о тех, useragent которых такой же как и в пользовательских браузерах


    а как отличить других ботов которые имеют одинаковый useragent невозможно.
    единственный действенный вариант, делать мета редирект для людей, браузеры переходят, а боты остаются, и php сравнивает тех кто перешёл и кто остался.
    можно ли сделать что по лучше, без редиректов и перезагрузок страниц ?
    например было бы хорошо iframe использовать, но он выводит значения неправильные, хотя в файле они правильные

    на странице есть фрейм, когда страница открыта с браузера, фрейм пишет секунды в файл.
    на странице под фреймом скрипт проверки, читаем файл и сравниваем с секундами. бывает погрешность на 1 секунду, но это я поправлял
    если открыть ботом то фрейм не читается, данные не равны
    но только вот почему то переменные не те идут, хотя в файле txt прописано всё то, но когда вывожу результаты переменных, то с iframe отстаёт вообще на непонятное значение, от куда оно берётся, хз, но в файле смотрю, там нужное значение, максимум на секунду отстаёт, как уже выше говорил об этом


    PHP:
    <?php 
    sleep
    (1);
    $vremja date('s');
    $include_file_txt=file($_SERVER['DOCUMENT_ROOT'].'/iframe.txt');
    $include_file trim($include_file_txt[0]);

    if (
    $vremja === $include_file) {
    echo 
    "browser";
    }
    else
    {
    echo 
    "bot";
    }
    echo 
    '<br>'.$include_file.'<br>and original '.$vremja;
    ?>
     

    iframe.php

    PHP:
    <?php 
    $zna4enie_test 
    $_SERVER['DOCUMENT_ROOT'].'/file.txt'
    $paremetr_test 'сюда пишется секунда' 
    file_put_contents($zna4enie_test$paremetr_testLOCK_EX); 
    ?>
    в чём может быть дело, почему выводит результат не тот который должен быть по значениям ?
     
    #1 GAiN, 7 Oct 2014
    Last edited: 7 Oct 2014
  2. KukMan

    KukMan New Member

    Joined:
    22 Feb 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    При посещении страницы вписываешь, что пришел бот. На странице отправляешь AJAX запрос на спец. адрес, в котором изменяешь на "пришел человек". Зашли с браузера, JS отправит AJAX. Пришел бот - ничего не отправит
     
  3. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    мда... чесно я вaxуе, иными словами не описать глубину моих чувств по поводу этой темы. Я бы посоветовал погуглить данную тему и поглубже с ней ознакомится. Это самый тупейший способ что я когда либо видел еще и реализован как-то через Ж. Кстати не у всех работают фреймы, это устарелая методика, если бы я работал в ПС я бы поставил даже такой фильтр, кто юзает фреймы тот вредонос.
    Обожаю такие коденги :D
     
  4. Eich3

    Eich3 Member

    Joined:
    27 Jan 2013
    Messages:
    22
    Likes Received:
    7
    Reputations:
    5
    Это не сработает, если бот использует Embedded IE/Selenium/WebKit или любую другую технологию для работы с динамическими страницами. А без специальных мер по обходу данных ограничений поисковыми роботами еще и воспрепятствует индексации сайта.

    От простых ботов, посылающих http-запросы, может помочь сервис cloudflare

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

    1. Количество новых сессий с одного IP в сутки/час/минуту
    2. Количество запросов с IP в час/минуту/сутки
    3. Имена HTTP-заголовков запроса
    4. Уникальность User-Agent'а (сейчас браузеры типа chrome и firefox обновляются автоматически и вместе с этим меняется версия в user-agent'е) на всем пуле пользователей
    5. Тепловая карта движений и кликов мышью на странице, как это например реализовано в я.метрике (кстати, поможет от примитивных браузерных ботов, которые не двигают мышкой по странице)
    6. Порядок запросов к различным URL и паузы между ними
    7. География IP-адреса юзера, провайдер
    8. Дата/время запросов по различным url
    9. Если на сайте есть формы, делаем там интерактивные подсказки и меряем скорость ввода букв
    ...... <куча других факторов, чем больше, тем лучше>

    после того, как все метрики (m1, m2, ..., mN) реализованы (их лучше представить числами), собираем данные какое-то время и делим на две выборки: обучающую и контрольную, в каждой выделяем два класса: люди и боты. Т.е. нужно указать самому, какие запросы осуществлялись возможно ботами, а какие - точно не ботами.

    Обучающую выборку (m1, m2, ..., mN) используем, чтобы подобрать весовые коэффициенты w1, w2, ..., wN, добиваясь того, чтобы выражение m1*w1 + m2*w2 + ... + mN*wN давало 0 для людей и 1 для ботов. После того, как коэффициенты подобраны, проверяем корректность определения бот/не бот на контрольной выборке (но не используем её для подбора весов!). Если там все в порядке и процент ложных детектов низкий, можно использовать формулу для отлова роботов в будущих запросах :p

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