Lütfen dikkat aşağıdaki yazacaklarım sadece bir fikirdir... ve uygulamalarda sorumluluk size aittir yalnış ve eksik bilgilerle yaparsanız normal kullanıcılarınızıda engelleyebilirsiniz.
Botlara karşı önlem için useragentlere odaklanmakta fayda olabilir.
useragent nedir? browserlar yada diğer programlar (filezilla, getright) sunucudan istekten bulunduklarında kim olduklarınıda söylerler. Google şu şekilde şöyler;
Alıntı
* Googlebot: standart web ve haber indexleyen botu
* Googlebot-Mobile: mobil web sitelerini indexleyen bot
* Googlebot-Image: resim indexi için kullandıkları bot
* Mediapartners-Google ,Adsbot-Google: adsense ve adwords için kullanılan botların useragenti
detaylı bilgi için bakınız
Firefox 3 de ise Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 (.NET CLR 3.5.30729) şeklinde görünür.
Birkaç farklı browserda şu adresten sizde test edip sonuçları görebilirsiniz.

Bazı uyanık programlama bilmeyen yada botlara para vermeyen arkadalarda gsitecrawler gibi crawlerdan faydalanıyor onun agent i da örnek vermek gerekirse GSiteCrawler/v1.xx rev. xxx (Google Sitemap Generator for Windows :: GSiteCrawler) şeklinde görünür. Yani piyasadaki bir çok crawlerin %90 agent i vardir.

Şimdi bu elimizdeki bilgiyi nasıl kullanıcaz? aslında oldukça basit aşağıdaki vereceğim örnek asp.net içindir ancak sizlerde benzer mantıkla php ye uygulayabilirsiniz.
Bir class 'a aşağıdaki fonksiyonu yazıyoruz.
    Shared Function botkontrol() As Boolean
        Dim ua As String
        Try
            ua = My.Request.UserAgent.ToString
            'shared functionda request direkt çağrılmaz. my'dan çağrılır.
        Catch ex As Exception
            ua = "BOT"
        End Try
        If ua = "BOT" Then
            Return False
        Else
            Return True
        End If
    End Function
Yukarıdaki kod napıyor? Çok basit istekte bulunan programın/browser in agent bilgisini alıyor. Özellikle try catch içerisine kondu. Çünkü; Bir çok bot yazarı kimliği ile ilgili derdi olmadı için istekte bulunurken agent'i set etmez ve normal HttpWebRequest'de bulunur. Bu nedenle "Object reference not set to an instance of an object." hatası alacağımız için try catch içerisine aldık.
Koda a göre basit bir botsa gelen False dönecek Form Load inizda buna göre işlem yapabilirsiniz.
örnek;
        If botkontrol() = False Then
            Response.Redirect("BOT.aspx")
        End If
Yukarıdaki örnek basit bir örnek olup. Sağlıksız olabilir. Çünkü kötü niyetli bot agentini set ettiyse onu algılayamazsınız. Peki bunun için napabiliriz. İzin verilenler için bir wordlist.txt oluşturup onun içinde geçip geçmediğine baktırabiliriz (Yada array oluşturun.) Bunun için loglarınızdan yararlanın size gelen programların agentlarına bakın ve istediklerinizin agent bilgilerinde neler var bakın. Log larınızda hizmet aldığınız hostingden böyle bir imkan yoksa bir süre agent bilgilerini bir txt ye yada db ye yazdırıp kullabilirsiniz.
Php de $_SERVER['HTTP_USER_AGENT']; ile agent bilgilerini alabileceğinizi biliyorsunuzdur.
Ayrıca apache kullanıcıları .htaccess dende yararlanabilirler bot ları bloklamak için. .htaccess için döküman (ingilizce)

Son olarak List of User-Agents (Spiders, Robots, Browser) adresinide paylaşmak istiyorum bilinen bir çok useragent bilgisi mevcut işinize yarayabilir.

Bunlar benim hızlı bir şekilde aklıma gelenler. Bu yöntem kullanılarak sonuç almak mümkün gibi görünsede sürekli takip ve izin verilenler/verilmeyenler için güncelleştirme gerekliliği şart görünüyor. Bir arkadaş bunu yapar ve web servisi haline getirip API ilede webmasterlarla paylaşırsa güzel bir webservisi ortaya çıkabilir