Какие методы я могу использовать для обнаружения роботов? - PullRequest
5 голосов
/ 22 июля 2011

То, что программное обеспечение автоматизировано, не означает, что оно будет соответствовать вашему robots.txt. Какие существуют методы, позволяющие определить, когда кто-то сканирует ваш сайт или работает над ним? Предположим, что ваш сайт имеет сотни тысяч страниц и его стоит сканировать или выполнять DDOS.

Вот глупая идея, которая у меня, вероятно, не работает: дать каждому пользователю cookie с уникальным значением и использовать cookie, чтобы узнать, когда кто-то делает второй / третий / и т. Д. Запрос. Это, вероятно, не работает, потому что сканеры, вероятно, не принимают куки, и поэтому в этой схеме робот будет выглядеть как новый пользователь с каждым запросом.

У кого-нибудь есть идеи получше?

Ответы [ 4 ]

4 голосов
/ 22 июля 2011

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

1 голос
/ 22 июля 2011

Project Honey Pot ведет список «плохих» ботов.

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

using System;
using System.Linq;
using System.Net;
using System.Xml.Linq;
using SeaRisenLib2.Text;
using XmlLib;

/// <summary>
/// Summary description for HoneyPot
/// </summary>
public class HoneyPot
{
    private const string KEY = "blacklistkey"; // blacklist key - need to register at httpbl.org to get it
    private const string HTTPBL = "dnsbl.httpbl.org"; // blacklist lookup host
public HoneyPot()
{
}

public static Score GetScore_ByIP(string ip)
{
    string sendMsg = "", receiveMsg = "";
    int errorCount = 0; // track where in try/catch we fail for debugging
    try
    {
        // for testing: ip = "188.143.232.31";
        //ip = "173.242.116.72";
        if ("127.0.0.1" == ip) return null; // localhost development computer
        IPAddress address;
        if (!IPAddress.TryParse(ip, out address))
            throw new Exception("Invalid IP address to HoneyPot.GetScore_ByIP:" + ip);
        errorCount++; // 1
        string reverseIP = ip.ToArray('.').Reverse().ToStringCSV(".");
        sendMsg = string.Format("{0}.{1}.{2}", KEY, reverseIP, HTTPBL);
        errorCount++; // 2
        //IPHostEntry value = Dns.GetHostByName(sendMsg);
        IPHostEntry value = Dns.GetHostEntry(sendMsg);
        errorCount++; // 3
        address = value.AddressList[0];
        errorCount++; // 4
        receiveMsg = address.ToString();
        errorCount++; // 5
        int[] ipArray = receiveMsg.ToArray('.').Select(s => Convert.ToInt32(s)).ToArray();
        errorCount++; // 6
        if (127 != ipArray[0]) // error
            throw new Exception("HoneyPot error");
        errorCount++; // 7
        Score score = new Score()
        {
            DaysSinceLastSeen = ipArray[1],
            Threat = ipArray[2],
            BotType = ipArray[3]
        };
        errorCount++; // 8
        return score;
    }
    catch (Exception ex)
    {
        Log.Using("VisitorLog/HoneyPotErrors", log =>
        {
            log.SetString("IPrequest", ip);
            log.SetString("SendMsg", sendMsg, XmlFile.ELEMENT);
            log.SetString("RecvMsg", receiveMsg, XmlFile.ELEMENT);
            log.SetString("Exception", ex.Message, XmlFile.ELEMENT);
            log.SetString("ErrorCount", errorCount.ToString());
        });
    }
    return null;
}

// Bitwise values
public enum BotTypeEnum : int
{
    SearchEngine = 0,
    Suspicious = 1,
    Harvester = 2,
    CommentSpammer = 4
}

public class Score
{
    public Score()
    {
        BotType = -1;
        DaysSinceLastSeen = -1;
        Threat = -1;
    }

    public int DaysSinceLastSeen { get; internal set; }
    public int Threat { get; internal set; }
    /// <summary>
    /// Use BotTypeEnum to understand value.
    /// </summary>
    public int BotType { get; internal set; }

    /// <summary>
    /// Convert HoneyPot Score values to String (DaysSinceLastSeen.Threat.BotType)
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
        return string.Format("{0}.{1}.{2}",
            DaysSinceLastSeen,
            Threat,
            BotType);
    }

    public static explicit operator XElement(Score score)
    {
        XElement xpot = new XElement("HoneyPot");
        if (null != score)
        {
            if (score.DaysSinceLastSeen >= 0)
                xpot.SetString("Days", score.DaysSinceLastSeen);
            if (score.Threat >= 0)
                xpot.SetString("Threat", score.Threat);
            if (score.BotType >= 0)
                xpot.SetString("Type", score.BotType);
            foreach (BotTypeEnum t in Enum.GetValues(typeof(BotTypeEnum)))
            {
                // Log enum values as string for each bitwise value represented in score.BotType
                int value = (int)t;
                if ((value == score.BotType) || ((value & score.BotType) > 0))
                    xpot.GetCategory(t.ToString());
            }
        }
        return xpot;
    }

    public static explicit operator Score(XElement xpot)
    {
        Score score = null;
        if (null != xpot)
            score = new Score()
            {
                DaysSinceLastSeen = xpot.GetInt("Days"),
                Threat = xpot.GetInt("Threat"),
                BotType = xpot.GetInt("Type")
            };
        return score;
    }
}

/// <summary>
/// Log score value to HoneyPot child Element (if score not null).
/// </summary>
/// <param name="score"></param>
/// <param name="parent"></param>
public static void LogScore(HoneyPot.Score score, XElement parent)
{
    if ((null != score) && (null != parent))
    {
        parent.Add((XElement)score);
    }
}

}

0 голосов
/ 22 июля 2011

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

Вы можете вести учет нарушителей и видеть, кто нарушает правила неоднократно:)

0 голосов
/ 22 июля 2011

Хотя технически он не "обнаруживает" роботов-роботов, у меня есть интересный способ их заблокировать.Мой метод заключается в создании фильтра IIS или плагина Apache.Что бы вы сделали, это зашифровать все ваши html, asp, php и т. Д.Единственной не зашифрованной страницей будет страница индекса.Страница индекса просто устанавливает cookie с зашифрованным открытым ключом, а затем перенаправляет на вторую страницу индекса.Затем IIS-фильтр или плагин Apache проверит каждый из них на наличие этих файлов cookie.Если это произойдет, фильтр расшифрует запрошенную страницу, а затем передаст страницу на веб-сервер для обработки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...