Latest TweetsVerify any search engine or visitor via CLI Forward-Reverse Lookup perishablepress.com/cli-forwar…
Perishable Press

Protect Your Site with a Blackhole for Bad Bots

[ Black Hole (Vector) ] One of my favorite security measures here at Perishable Press is the site’s virtual Blackhole trap for bad bots. The concept is simple: include a hidden link to a robots.txt-forbidden directory somewhere on your pages. Bots that ignore or disobey your robots rules will crawl the link and fall into the honeypot trap, which then performs a WHOIS Lookup and records the event in the blackhole data file. Once added to the blacklist data file, bad bots immediately are denied access to your site.

WordPress user? Check out the free Blackhole plugin and Blackhole Pro »

[ Black Hole (Graphic) ] I call it the “one-strike” rule: bots have one chance to follow the robots.txt protocol, check the site’s robots.txt file, and obey its directives. Failure to comply results in immediate banishment. The best part is that the Blackhole only affects bad bots: normal users never see the hidden link, and good bots obey the robots rules in the first place. So the percentage of false positives is extremely low to non-existent. It’s an ideal way to protect your site against bad bots silently, efficiently, and effectively.

With a few easy steps, you can set up your own Blackhole to trap bad bots and protect your site from evil scripts, bandwidth thieves, content scrapers, spammers, and other malicious behavior.

[ Blackhole for Bad Bots ] The Blackhole is built with PHP, and uses a bit of .htaccess to protect the blackhole directory. Refined over the years and completely revamped for this tutorial, the Blackhole consists of a plug-&-play /blackhole/ directory that contains the following three files:

  • .htaccess – protects the log file
  • blackhole.dat – log file
  • index.php – blackhole script

These three files work together to create the Blackhole for Bad Bots. If you are running WordPress, the Blackhole plugin is recommended instead of this standalone PHP version.

Note: By default, .htaccess files are hidden on Windows and OS X, so to view them you need to enable “Show hidden files” on your machine, or use any FTP or code-editing app that is capable of displaying them. It’s a common feature.

Installation Overview

The Blackhole is developed to make implementation as easy as possible. Here is an overview of the steps:

  1. Upload the /blackhole/ directory to your site
  2. Edit the three variables in the “EDIT HERE” section in index.php.
  3. Ensure writable server permissions for the blackhole.dat file
  4. Add a single line to the top of your pages to include the index.php file
  5. Add a hidden link to the /blackhole/ directory in the footer
  6. Forbid crawling of /blackhole/ by adding a line to your robots.txt

It’s that easy to install on your own site, but there are many ways to customize functionality. For complete instructions, jump ahead to Implementation and Configuration. For now, I think a good way to understand how it works is to check out a demo..

Update: This is the original Blackhole tutorial for the standalone PHP script. For a summary of this info, check out Blackhole for Bad Bots – PHP Version »

One-time Live Demo

I have set up a working demo of the Blackhole for this tutorial. It works exactly like the download version, but it’s configured to block you only from the demo, not from the entire site. Here’s how it works:

  1. First visit to the Blackhole demo loads the trap page, runs the whois lookup, and adds your IP address to the blacklist data file
  2. Once you’re added to the blacklist, all subsequent requests for the Blackhole demo will be denied access

So you get one chance to see how it works. Once you visit, your IP will be blocked from the demo only – you will still have full access to this tutorial (and everything else). That said, here is the demo link: Blackhole Demo. Visit once to see the Blackhole trap, and then again to observe that you’ve been blocked. Again, even if you are blocked from the demo page, you will continue to have access to everything else on this domain.

Implementation and Configuration

[ Black Hole (Physical) ] Here are complete instructions for implementing the PHP/standalone of Blackhole for Bad Bots. Note that these steps are written for Apache servers running PHP. The steps are the same for other PHP-enabled servers (e.g., Nginx, IIS), but you will need to replace the .htaccess file and rules with whatever works for particular server environment. Note: for a concise summary of these steps, check out this tutorial.

Step 1: Download the Blackhole zip file, unzip and upload to your site’s root directory. This location is not required, but it enables everything to work out of the box. To use a different location, edit the include path in Step 4.

Step 2: Edit the three variables in the “EDIT HERE” section in index.php.

Step 3: Change file permissions for blackhole.dat to make it writable by the server. The permission settings may vary depending on server configuration. If you are unsure about this, ask your host. Note that the blackhole script needs to be able to read, write, and execute the blackhole.dat file.

Step 4: Include the Blackhole script by adding the following line to the top of your pages (e.g., header.php):

<?php include(realpath(getenv('DOCUMENT_ROOT')) . '/blackhole/index.php'); ?>

The Blackhole script checks the bot’s IP address against the blacklist data file. If a match is found, the request is blocked with a customizable message. View the source code for more information.

Step 5: Add a hidden link to the /blackhole/ directory in the footer of your site’s web pages:

<a rel="nofollow" style="display:none;" href="https://example.com/blackhole/">Do NOT follow this link or you will be banned from the site!</a>

This is the hidden link that bad bots will follow. It’s currently hidden with CSS, so 99.999% of visitors won’t ever see it. Alternately, to hide the link from users without relying on CSS, replace the anchor text with a transparent 1-pixel GIF image. For example:

<a rel="nofollow" style="display:none;" href="http://example.com/blackhole/" title="Do NOT follow this link or you will be banned from the site!"><img src="/images/1px.gif" alt="" /></a>

Remember to edit the link href value and the image src to match the correct locations on your server.

Step 6: Finally, add a Disallow directive to your site’s robots.txt file:

User-agent: *
Disallow: /blackhole/

This step is pretty important. Without the proper robots directives, all bots would fall into the Blackhole because they wouldn’t know any better. If a bot wants to crawl your site, it must obey the rules! The robots rule that we are using basically says, “All bots DO NOT visit the /blackhole/ directory or anything inside of it.” So it is important to get your robots rules correct. Please use a robots validator to verify proper syntax.

Step 7: Done! Remember to test thoroughly before going live. Also check out Further Customization for more ideas.

Testing

[ Black Hole (Figurative) ] You can verify that the script is working by visiting the hidden Blackhole link (added in step 5). That should take you to the Blackhole warning page, and block you from further access. To verify that you’ve been blocked, try visiting another page on your site. To restore site access, you can clear the contents of the blackhole.dat log file.

Important: Make sure that your robots rules are correct and have proper syntax. For example, you can use the robots checker in Google Webmaster Tools.

Further Customization

The previous steps will get the Blackhole working, but there are some details that you may want to customize:

  • index.php (lines 54–56): Edit the three variables
  • index.php (line 172): Check/replace path to your contact form
  • index.php (lines 159–182): Customize markup of the warning page
  • index.php (line 196): Customize the list of whitelisted bots

These are the recommended changes, but the PHP is clean and generates valid HTML, so feel free to modify the markup as needed.

File Path

If you get an error letting you know that a file cannot be found, it could be an issue with how the script specifies the absolute path, using getenv('DOCUMENT_ROOT'). That function works on a majority of servers, but if it fails on your server for whatever reason, you can simply replace it with the actual path. From Step 4, the include script looks like this:

<?php include(realpath(getenv('DOCUMENT_ROOT')) . '/blackhole/index.php'); ?>

So if you are getting not-found errors, try this instead:

/var/www/httpdocs/blackhole/index.php

So that would be the actual absolute path to the blackhole index.php file on your server. As long as you get the path correct, it’s gonna fix any “file can’t be found” type errors you may be experiencing.

If in doubt about the actual full absolute path, consult your web host or use a PHP function or constant such as __DIR__ to obtain the correct infos. And check out my tutorial over at WP-Mix for more information about including files with PHP and WordPress.

Caveat Emptor

Blocking bots is serious business. Good bots obey robots.txt rules, but there may be potentially useful bots that do not. Yahoo is the perfect example: it’s a valid search engine that sends some traffic, but sadly the Yahoo Slurp bot is too stupid to follow the rules. Since setting up the Blackhole several years ago, I’ve seen Slurp disobey robots rules hundreds of times.

By default, the Blackhole DOES NOT BLOCK any of the big search engines. So Google, Bing, and company always will be allowed access to your site, even if they disobey your robots.txt rules. See the next section for more information.

Whitelisting Search Bots

Blackhole whitelists all bots related to any of the following search engines:

  • AOL.com
  • Baidu
  • Bing/MSN
  • DuckDuckGo
  • Google
  • Teoma
  • Yahoo!
  • Yandex

More specifically, here is the list of regex strings that are checked for each request:

aolbuild, baidu, bingbot, bingpreview, msnbot, duckduckgo, adsbot-google, googlebot, mediapartners-google, teoma, slurp, yandex

So any bot that reports a user agent that contains any of these strings will NOT be blocked and will have full access to your site under all conditions. To customize the list of whitelisted bots, open index.php and edit line 196.

Whitelisting these user agents ensures that anything claiming to be a major search engine is allowed open access. The downside is that user-agent strings are easily spoofed, so a bad bot could crawl along and say, “Hey look, I’m teh Googlebot!” and the whitelist would grant access.

It is possible to verify the true identity of each bot, but doing so consumes significant resources and could overload the server. Avoiding that scenario, the Blackhole errs on the side of caution: it’s better to allow a few spoofs than to block any of the major search engines.

License and Disclaimer

Blackhole for Bad Bots is released under GNU General Public License. By downloading the Blackhole, you agree to accept full responsibility for its use. In no way shall the author be held accountable for anything that happens after the file has been downloaded.

Questions & Feedback

Questions? Comments? Send ’em via my contact form. Thanks!

Blackhole Download

Here you can download the latest version of Blackhole for Bad Bots.

Standalone PHP version, last updated: 2018/05/11
Blackhole for Bad Bots – Version 4.1 (5 KB zip)
Note: if you have trouble “unzipping” the file, try downloading the file again using the Iridium browser.

Jeff Starr
About the Author Jeff Starr = Fullstack Developer. Book Author. Teacher. Human Being.
Archives
184 responses
  1. ok so thats how it works?? (im a beginner 15 yrs old sry). whoever falls into the trap, his IP is written into the blackhole.dat file. whenever the bot tries to visit again, blackhole.php checks it against the .dat file and does it stuff? right?

  2. one more question. ive been caching my files with .htacess with expire headers technique… can it effect something? like caching the banned thing and showing it even if the person is not banned. ive not cached for .php files

  3. Jeff Starr

    Ayoosh,
    The data used to determine whether to block a site is located in the .dat file, which is accessed at the server level by the blackhole script and thus shouldn’t be affected by htaccess caching rules directed at the client/browser.

  4. I like the concept though I feel that blocking IP addresses should be handled by the webserver (apache) or a firewall. It’s just a gut feeling.

  5. How can I manually add IP addresses to block into my blackhole.dat file? I have a few known problems that I just have the IP address for, not the additional information that Blackhole logs.

    Do I just list these IP addresses without the accompanying “Get” date, user agent, etc.?

  6. Barbara, add the IP’s you want to block to your .htaccess file like so:

    Order Allow,Deny
    Allow from all
    Deny from 65.55.3.211
    Deny from 72.229.57.27
    Deny from 77.93.2.81

  7. Ok, forgot to use code tags, let’s see if this one comes out right:

    <Limit GET POST PUT>
       Order Allow,Deny
       Allow from all
       Deny from 65.55.3.211
       Deny from 72.229.57.27
       Deny from 77.93.2.81
       Deny from 77.221.130.18
       Deny from 91.205.96.13
       Deny from 94.75.229.132
       Deny from 95.108.157.252
       Deny from 99.22.93.95
       Deny from 173.193.219.168
       Deny from 174.133.177.66
       Deny from 178.234.154.230
       Deny from 178.33.3.23
       Deny from 190.174.198.86
       Deny from 203.89.212.187
       Deny from 207.241.228.166
       Deny from 213.55.76.224
       Deny from 216.171.98.77
    </Limit>

  8. Thanks paperboy. I wanted to still get the nice banning message screen that I did with the blackhole, so I found that entering the IP address with – GET on the end into the blackhole.dat file also works for the banning.

  9. Very nice work. I discovered this after Slurp took 3.8Gigs of data from my site and I had enough! Also nice to sprinkle into the index pages of directories no one should know about.

    – Kris

  10. I don’t understand how the entries in the .dat file prevent the bot from visiting the site. Do these entries become “Deny from” lines in the .htaccess file?

  11. Jeff Starr

    @Jack A: the .dat file is read by the script, which then allows or blocks accordingly. No changes are made to your .htaccess file.

  12. Ok, so now I’ve been using blackhole for a week and have some questions.

    If I put the hidden link to my forbidden folder at the bottom of my page, doesn’t that mean that the crawler has already visited many of my site’s pages?

    Do I need to include blackhole.php on all of my pages?

    The next time the bot visits my site is when I catch him, right?

[ Comments are closed for this post ]