[phpbbreloaded-checkins] SF.net SVN: phpbbreloaded: [282] main/trunk
Status: Planning
Brought to you by:
tehphpmaster
From: <mj...@us...> - 2006-12-31 16:08:17
|
Revision: 282 http://svn.sourceforge.net/phpbbreloaded/?rev=282&view=rev Author: mjnr Date: 2006-12-31 08:08:16 -0800 (Sun, 31 Dec 2006) Log Message: ----------- Added basic functionality to cope with additional (non phpBBreloaded specific) packages. Also started the ball rolling with the first graft of the anti-spam GPL software Bad Behavio(u)r. (Version 2.0.8) Have included a new directory off the root called 'extras'. This should be used to store any externally developed packages / libraries that we wish to release with phpBBreloaded (such as Bad Behavio(u)r). Modified Paths: -------------- main/trunk/common.php Added Paths: ----------- main/trunk/extras/ main/trunk/extras/Bad-Behavior/ main/trunk/extras/Bad-Behavior/bad-behavior/ main/trunk/extras/Bad-Behavior/bad-behavior/admin.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/banned.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/blackhole.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/blacklist.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/common_tests.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/core.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/functions.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/google.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/housekeeping.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/index.html main/trunk/extras/Bad-Behavior/bad-behavior/konqueror.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/lynx.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/movabletype.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/mozilla.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/msie.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/msnbot.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/opera.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/post.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/responses.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/safari.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/screener.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/trackback.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/version.inc.php main/trunk/extras/Bad-Behavior/bad-behavior/whitelist.inc.php main/trunk/extras/Bad-Behavior/bad-behavior-phpBBreloaded.php main/trunk/extras/Bad-Behavior/index.html main/trunk/extras_config.php Modified: main/trunk/common.php =================================================================== --- main/trunk/common.php 2006-12-30 04:58:08 UTC (rev 281) +++ main/trunk/common.php 2006-12-31 16:08:16 UTC (rev 282) @@ -176,6 +176,11 @@ include($phpbb_root_path . 'config.'.$phpEx); +/******************************************************************************* + * Include support for phpBBreloaded extra packages now. + ******************************************************************************/ +include($phpbb_root_path . 'extras_config.'.$phpEx); + if( !defined("PHPBB_INSTALLED") ) { header('Location: ' . $phpbb_root_path . 'install/install.' . $phpEx); @@ -189,6 +194,18 @@ include($phpbb_root_path . 'includes/functions.'.$phpEx); include($phpbb_root_path . 'includes/db.'.$phpEx); +/******************************************************************************* + * If specified, include the 'Bad Behaviour' code now... + * http://homelandstupidity.us/software/bad-behavior/ + * I have placed this here as I may want access to the db functions later in + * order to utilise the Bad Behaviour logging. For now it's a simple spam + * blocker! + ******************************************************************************/ +if(defined('BAD_BEHAVIOUR_ROOT')) +{ + include(BAD_BEHAVIOUR_ROOT . 'bad-behavior-phpBBreloaded.'.$phpEx); +} + // We do not need this any longer, unset for safety purposes unset($dbpasswd); Added: main/trunk/extras/Bad-Behavior/bad-behavior/admin.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/admin.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/admin.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,75 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +function bb2_admin_pages() { + if (function_exists('current_user_can')) { + // The new 2.x way + if (current_user_can('manage_options')) { + $bb2_is_admin = true; + } + } else { + // The old 1.x way + global $user_ID; + if (user_can_edit_user($user_ID, 0)) { + $bb2_is_admin = true; + } + } + + if ($bb2_is_admin) { + add_options_page(__("Bad Behavior"), __("Bad Behavior"), 8, 'bb2_options', 'bb2_options'); + } +} + +function bb2_options() +{ + $settings = bb2_read_settings(); + + if ($_POST) { + if ($_POST['display_stats']) { + $settings['display_stats'] = true; + } else { + $settings['display_stats'] = false; + } + if ($_POST['strict']) { + $settings['strict'] = true; + } else { + $settings['strict'] = false; + } + if ($_POST['verbose']) { + $settings['verbose'] = true; + } else { + $settings['verbose'] = false; + } + bb2_write_settings($settings); +?> + <div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div> +<?php + } +?> + <div class="wrap"> + <h2><?php _e("Bad Behavior"); ?></h2> + <form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>"> + <p>For more information please visit the <a href="http://www.homelandstupidity.us/software/bad-behavior/">Bad Behavior</a> homepage.</p> + <p>If you find Bad Behavior valuable, please consider making a <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=error%40ioerror%2eus&item_name=Bad%20Behavior%20<?php echo BB2_VERSION; ?>%20%28From%20Admin%29&no_shipping=1&cn=Comments%20about%20Bad%20Behavior&tax=0¤cy_code=USD&bn=PP%2dDonationsBF&charset=UTF%2d8">financial contribution</a> to further development of Bad Behavior.</p> + + <fieldset class="options"> + <legend><?php _e('Statistics'); ?></legend> + <?php bb2_insert_stats(true); ?> + <p><label><input type="checkbox" name="display_stats" value="true" <?php if ($settings['display_stats']) { ?>checked="checked" <?php } ?>/> <?php _e('Display statistics in blog footer'); ?></label></p> + </fieldset> + + <fieldset class="options"> + <legend><?php _e('Logging'); ?></legend> + <p><label><input type="checkbox" name="verbose" value="true" <?php if ($settings['verbose']) { ?>checked="checked" <?php } ?>/> <?php _e('Verbose HTTP request logging'); ?></label></p> + <legend><?php _e('Strict Mode'); ?></legend> + <p><label><input type="checkbox" name="strict" value="true" <?php if ($settings['strict']) { ?>checked="checked" <?php } ?>/> <?php _e('Strict checking (blocks more spam but may block some people)'); ?></label></p> + </fieldset> + + <p class="submit"><input type="submit" name="submit" value="<?php _e('Update »'); ?>" /></p> + </form> + </div> +<?php +} + +add_action('admin_menu', 'bb2_admin_pages'); + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/banned.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/banned.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/banned.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,48 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Functions called when a request has been denied +// This part can be gawd-awful slow, doesn't matter :) + +require_once(BB2_CORE . "/responses.inc.php"); + +function bb2_display_denial($settings, $key, $previous_key = false) +{ + if (!$previous_key) $previous_key = $key; + if ($key == "e87553e1") { + // FIXME: lookup the real key + } + // Create support key + $ip = explode(".", $_SERVER['REMOTE_ADDR']); + $ip_hex = ""; + foreach ($ip as $octet) { + $ip_hex .= str_pad(dechex($octet), 2, 0, STR_PAD_LEFT); + } + $support_key = implode("-", str_split("$ip_hex$key", 4)); + + // Get response data + $response = bb2_get_response($previous_key); + header("HTTP/1.1 " . $response['response'] . " Bad Behavior"); + header("Status: " . $response['response'] . " Bad Behavior"); +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>HTTP Error <?php echo $response['response']; ?></title> +</head> +<body> +<h1>Error <?php echo $response['response']; ?></h1> +<p>We're sorry, but we could not fulfill your request for +<?php echo htmlspecialchars($_SERVER['REQUEST_URI']) ?> on this server.</p> +<p><?php echo $response['explanation']; ?></p> +<p>Your technical support key is: <strong><?php echo $support_key; ?></strong></p> +<p>You can use this key to <a href="http://www.ioerror.us/bb2-support-key?key=<?php echo $support_key; ?>">fix this problem yourself</a>.</p> +<p>If you are unable to fix the problem yourself, please contact <a href="mailto:<?php echo htmlspecialchars(str_replace("@", "+nospam@nospam.", bb2_email())); ?>"><?php echo htmlspecialchars(str_replace("@", " at ", bb2_email())); ?></a> and be sure to provide the technical support key shown above.</p> +<?php +} + +function bb2_log_denial($settings, $package, $key, $previous_key=false) +{ + bb2_db_query(bb2_insert($settings, $package, $key)); +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/blackhole.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/blackhole.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/blackhole.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,37 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Look up address on various blackhole lists. +// These cannot be used for GET requests under any circumstances! +function bb2_blackhole($package) { + // Only conservative lists + $bb2_blackhole_lists = array( + "sbl-xbl.spamhaus.org", // All around nasties +// "dnsbl.sorbs.net", // Old useless data. +// "list.dsbl.org", // Old useless data. + "dnsbl.ioerror.us", // Bad Behavior Blackhole + ); + + // Things that shouldn't be blocked, from aggregate lists + $bb2_blackhole_exceptions = array( + "sbl-xbl.spamhaus.org" => array("127.0.0.4"), // CBL is problematic + "dnsbl.sorbs.net" => array("127.0.0.10",), // Dynamic IPs only + "list.dsbl.org" => array(), + "dnsbl.ioerror.us" => array(), + ); + + // Check the blackhole lists + $ip = $package['ip']; + $find = implode('.', array_reverse(explode('.', $ip))); + foreach ($bb2_blackhole_lists as $dnsbl) { + $result = gethostbynamel($find . "." . $dnsbl . "."); + if (!empty($result)) { + // Got a match and it isn't on the exception list + $result = @array_diff($result, $bb2_blackhole_exceptions[$dnsbl]); + if (!empty($result)) { + return '136673cd'; + } + } + } + return false; +} +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/blacklist.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/blacklist.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/blacklist.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,106 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +function bb2_blacklist($package) { + + // Blacklisted user agents + // These user agent strings occur at the beginning of the line. + $bb2_spambots_0 = array( + "<sc", // XSS exploit attempts + "8484 Boston Project", // video poker/porn spam + "adwords", // referrer spam + "autoemailspider", // spam harvester + "blogsearchbot-martin", // from honeypot + "Digger", // spam harvester + "ecollector", // spam harvester + "EmailCollector", // spam harvester + "Email Extractor", // spam harvester + "Email Siphon", // spam harvester + "EmailSiphon", // spam harvester + "grub crawler", // misc comment/email spam + "HttpProxy", // misc comment/email spam + "Internet Explorer", // XMLRPC exploits seen + "Jakarta Commons", // custommised spambots + "Java 1.", // definitely a spammer + "Java/1.", // definitely a spammer + "libwww-perl", // spambot scripts + "LWP", // spambot scripts + "Microsoft URL", // spam harvester + "Missigua", // spam harvester + "Movable Type", // customised spambots + "Mozilla ", // malicious software + "Mozilla/4.0(", // from honeypot + "Mozilla/4.0+(", // suspicious harvester + "MSIE", // malicious software + "OmniExplorer", // spam harvester + "PussyCat ", // misc comment spam + "psycheclone", // spam harvester + "Shockwave Flash", // spam harvester + "User Agent: ", // spam harvester + "User-Agent: ", // spam harvester + "Wordpress Hash Grabber",// malicious software + "\"", // malicious software + ); + + // These user agent strings occur anywhere within the line. + $bb2_spambots = array( + "\r", // A really dumb bot + "; Widows ", // misc comment/email spam + "a href=", // referrer spam + "Bad Behavior Test", // Add this to your user-agent to test BB + "compatible ; MSIE", // misc comment/email spam + "compatible-", // misc comment/email spam + "DTS Agent", // misc comment/email spam + "Gecko/25", // revisit this in 500 years + "grub-client", // search engine ignores robots.txt + "hanzoweb", // very badly behaved crawler + "Indy Library", // misc comment/email spam + "larbin@unspecified", // stealth harvesters + "Murzillo compatible", // comment spam bot + ".NET CLR 1)", // free poker, etc. + "POE-Component-Client", // free poker, etc. + "Turing Machine", // www.anonymizer.com abuse + "WISEbot", // spam harvester + "WISEnutbot", // spam harvester + "Windows NT 4.0;)", // wikispam bot + "Windows NT 5.0;)", // wikispam bot + "Windows NT 5.1;)", // wikispam bot + "Windows XP 5", // spam harvester + "\\\\)", // spam harvester + ); + + // These are regular expression matches. + $bb2_spambots_regex = array( + "/^[A-Z]{10}$/", // misc email spam + "/^Mozilla...[05]$/i", // fake user agent/email spam + "/[bcdfghjklmnpqrstvwxz ]{8,}/", +// "/(;\){1,2}$/", // misc spammers/harvesters +// "/MSIE.*Windows XP/", // misc comment spam + ); + + // Do not edit below this line. + + $ua = $package['headers_mixed']['User-Agent']; + + foreach ($bb2_spambots_0 as $spambot) { + $pos = stripos($ua, $spambot); + if ($pos !== FALSE && $pos == 0) { + return "17f4e8c8"; + } + } + + foreach ($bb2_spambots as $spambot) { + if (stripos($ua, $spambot) !== FALSE) { + return "17f4e8c8"; + } + } + + foreach ($bb2_spambots_regex as $spambot) { + if (preg_match($spambot, $ua)) { + return "17f4e8c8"; + } + } + + return FALSE; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/common_tests.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/common_tests.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/common_tests.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,113 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Enforce adherence to protocol version claimed by user-agent. + +function bb2_protocol($settings, $package) +{ + // Is it claiming to be HTTP/1.0? Then it shouldn't do HTTP/1.1 things + // Always run this test; we should never see Expect: + if (array_key_exists('Expect', $package['headers_mixed']) && stripos($package['headers_mixed']['Expect'], "100-continue") !== FALSE) { + return "a0105122"; + } + + // Is it claiming to be HTTP/1.1? Then it shouldn't do HTTP/1.0 things + // Blocks some common corporate proxy servers in strict mode + if ($settings['strict'] && !strcmp($package['server_protocol'], "HTTP/1.1")) { + if (array_key_exists('Pragma', $package['headers_mixed']) && strpos($package['headers_mixed']['Pragma'], "no-cache") !== FALSE && !array_key_exists('Cache-Control', $package['headers_mixed'])) { + return "41feed15"; + } + } + return false; +} + +function bb2_misc_headers($settings, $package) +{ + $ua = $package['headers_mixed']['User-Agent']; + + if (!strcmp($package['request_method'], "POST") && empty($ua)) { + return "f9f2b8b9"; + } + + // Broken spambots send URLs with various invalid characters + if (strpos($package['request_uri'], "#") !== FALSE || strpos($package['headers_mixed']['Referer'], "#") !== FALSE) { + return "dfd9b1ad"; + } + + // Range: field exists and begins with 0 + // Real user-agents do not start ranges at 0 + // NOTE: this blocks the whois.sc bot. No big loss. + if (array_key_exists('Range', $package['headers_mixed']) && strpos($package['headers_mixed']['Range'], "=0-") !== FALSE) { + if (strncmp($ua, "MovableType", 11)) { + return "7ad04a8a"; + } + } + + // Content-Range is a response header, not a request header + if (array_key_exists('Content-Range', $package['headers_mixed'])) { + return '7d12528e'; + } + + // Lowercase via is used by open proxies/referrer spammers + if (array_key_exists('via', $package['headers'])) { + return "9c9e4979"; + } + + // pinappleproxy is used by referrer spammers + if (array_key_exists('Via', $package['headers_mixed'])) { + if (stripos($package['headers_mixed']['Via'], "pinappleproxy") !== FALSE || stripos($package['headers_mixed']['Via'], "PCNETSERVER") !== FALSE || stripos($package['headers_mixed']['Via'], "Invisiware") !== FALSE) { + return "939a6fbb"; + } + } + + // TE: if present must have Connection: TE + // RFC 2616 14.39 + // Blocks Microsoft ISA Server 2004 in strict mode. Contact Microsoft + // to obtain a hotfix. + if ($settings['strict'] && array_key_exists('Te', $package['headers_mixed'])) { + if (!preg_match('/\bTE\b/', $package['headers_mixed']['Connection'])) { + return "582ec5e4"; + } + } + + if (array_key_exists('Connection', $package['headers_mixed'])) { + // Connection: keep-alive and close are mutually exclusive + if (preg_match('/\bKeep-Alive\b/i', $package['headers_mixed']['Connection']) && preg_match('/\bClose\b/i', $package['headers_mixed']['Connection'])) { + return "a52f0448"; + } + // Close shouldn't appear twice + if (preg_match('/\bclose,\s?close\b/i', $package['headers_mixed']['Connection'])) { + return "a52f0448"; + } + // Keey-Alive shouldn't appear twice either + if (preg_match('/\bkeep-alive,\s?keep-alive\b/i', $package['headers_mixed']['Connection'])) { + return "a52f0448"; + } + } + + + // Headers which are not seen from normal user agents; only malicious bots + if (array_key_exists('X-Aaaaaaaaaaaa', $package['headers_mixed']) || array_key_exists('X-Aaaaaaaaaa', $package['headers_mixed'])) { + return "b9cc1d86"; + } + if (array_key_exists('Proxy-Connection', $package['headers_mixed'])) { + return "b7830251"; + } + + if (array_key_exists('Referer', $package['headers_mixed'])) { + // Referer, if it exists, must not be blank + if (empty($package['headers_mixed'])) { + return "69920ee5"; + } + + // Referer, if it exists, must contain a : + // While a relative URL is technically valid in Referer, all known + // legit user-agents send an absolute URL + if (strpos($package['headers_mixed']['Referer'], ":") === FALSE) { + return "45b35e30"; + } + } + + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/core.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/core.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/core.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,203 @@ +<?php if (!defined('BB2_CWD')) die("I said no cheating!"); + +// Bad Behavior entry point is start_bad_behavior(). +// If you're reading this, you are probably lost. +// Go read the bad-behavior-generic.php file. + +define('BB2_CORE', dirname(__FILE__)); +define('BB2_COOKIE', 'bb2_screener_'); + +require_once(BB2_CORE . "/functions.inc.php"); + +// Our log table structure +function bb2_table_structure($name) +{ + // It's not paranoia if they really are out to get you. + $name_escaped = bb2_db_escape($name); + return "CREATE TABLE IF NOT EXISTS `$name_escaped` ( + `id` INT(11) NOT NULL auto_increment, + `ip` TEXT NOT NULL, + `date` DATETIME NOT NULL default '0000-00-00 00:00:00', + `request_method` TEXT NOT NULL, + `request_uri` TEXT NOT NULL, + `server_protocol` TEXT NOT NULL, + `http_headers` TEXT NOT NULL, + `user_agent` TEXT NOT NULL, + `request_entity` TEXT NOT NULL, + `key` TEXT NOT NULL, + INDEX (`ip`(15)), + INDEX (`user_agent`(10)), + PRIMARY KEY (`id`) );"; // TODO: INDEX might need tuning +} + +// Insert a new record +function bb2_insert($settings, $package, $key) +{ + $ip = bb2_db_escape($package['ip']); + $date = bb2_db_date(); + $request_method = bb2_db_escape($package['request_method']); + $request_uri = bb2_db_escape($package['request_uri']); + $server_protocol = bb2_db_escape($package['server_protocol']); + $user_agent = bb2_db_escape($package['user_agent']); + $headers = "$request_method $request_uri $server_protocol\n"; + foreach ($package['headers'] as $h => $v) { + $headers .= bb2_db_escape("$h: $v\n"); + } + $request_entity = ""; + if (!strcasecmp($request_method, "POST")) { + foreach ($package['request_entity'] as $h => $v) { + $request_entity .= bb2_db_escape("$h: $v\n"); + } + } + return "INSERT INTO `" . bb2_db_escape($settings['log_table']) . "` + (`ip`, `date`, `request_method`, `request_uri`, `server_protocol`, `http_headers`, `user_agent`, `request_entity`, `key`) VALUES + ('$ip', '$date', '$request_method', '$request_uri', '$server_protocol', '$headers', '$user_agent', '$request_entity', '$key')"; +} + +// Kill 'em all! +function bb2_banned($settings, $package, $key, $previous_key=false) +{ + // Some spambots hit too hard. Slow them down a bit. + sleep(2); + + require_once(BB2_CORE . "/banned.inc.php"); + bb2_display_denial($settings, $key, $previous_key); + bb2_log_denial($settings, $package, $key, $previous_key); + if (is_callable('bb2_banned_callback')) { + bb2_banned_callback($settings, $package, $key); + } + // Penalize the spammers some more + require_once(BB2_CORE . "/housekeeping.inc.php"); + bb2_housekeeping($settings, $package); + die(); +} + +function bb2_approved($settings, $package) +{ + // Dirk wanted this + if (is_callable('bb2_approved_callback')) { + bb2_approved_callback($settings, $package); + } + + // Decide what to log on approved requests. + if ($settings['verbose'] || empty($package['user_agent'])) { + bb2_db_query(bb2_insert($settings, $package, "00000000")); + } +} + +// Check the results of a particular test; see below for usage +// Returns FALSE if test passed (yes this is backwards) +function bb2_test($settings, $package, $result) +{ + if ($result !== FALSE) + { + bb2_banned($settings, $package, $result); + return TRUE; + } + return FALSE; +} + + +// Let God sort 'em out! +function bb2_start($settings) +{ + // Gather up all the information we need, first of all. + $headers = bb2_load_headers(); + // Postprocess the headers to mixed-case + // FIXME: get the world to stop using PHP as CGI + $headers_mixed = array(); + foreach ($headers as $h => $v) { + $headers_mixed[uc_all($h)] = $v; + } + + // We use these frequently. Keep a copy close at hand. + $ip = $_SERVER['REMOTE_ADDR']; + $request_method = $_SERVER['REQUEST_METHOD']; + $request_uri = $_SERVER['REQUEST_URI']; + $server_protocol = $_SERVER['SERVER_PROTOCOL']; + $user_agent = $_SERVER['HTTP_USER_AGENT']; + + // Reconstruct the HTTP entity, if present. + $request_entity = array(); + if (!strcasecmp($request_method, "POST") || !strcasecmp($request_method, "PUT")) { + foreach ($_POST as $h => $v) { + $request_entity[$h] = $v; + } + } + + $package = array('ip' => $ip, 'headers' => $headers, 'headers_mixed' => $headers_mixed, 'request_method' => $request_method, 'request_uri' => $request_uri, 'server_protocol' => $server_protocol, 'request_entity' => $request_entity, 'user_agent' => $user_agent, 'is_browser' => false); + + // Please proceed to the security checkpoint and have your + // identification and boarding pass ready. + + // First check the whitelist + require_once(BB2_CORE . "/whitelist.inc.php"); + if (!bb2_whitelist($package)) { + // Now check the blacklist + require_once(BB2_CORE . "/blacklist.inc.php"); + bb2_test($settings, $package, bb2_blacklist($package)); + + // Check for common stuff + require_once(BB2_CORE . "/common_tests.inc.php"); + bb2_test($settings, $package, bb2_protocol($settings, $package)); + bb2_test($settings, $package, bb2_misc_headers($settings, $package)); + + // Specific checks + $ua = $headers_mixed['User-Agent']; + // MSIE checks + if (stripos($ua, "MSIE") !== FALSE) { + $package['is_browser'] = true; + if (stripos($ua, "Opera") !== FALSE) { + require_once(BB2_CORE . "/opera.inc.php"); + bb2_test($settings, $package, bb2_opera($package)); + } else { + require_once(BB2_CORE . "/msie.inc.php"); + bb2_test($settings, $package, bb2_msie($package)); + } + } elseif (stripos($ua, "Konqueror") !== FALSE) { + $package['is_browser'] = true; + require_once(BB2_CORE . "/konqueror.inc.php"); + bb2_test($settings, $package, bb2_konqueror($package)); + } elseif (stripos($ua, "Opera") !== FALSE) { + $package['is_browser'] = true; + require_once(BB2_CORE . "/opera.inc.php"); + bb2_test($settings, $package, bb2_opera($package)); + } elseif (stripos($ua, "Safari") !== FALSE) { + $package['is_browser'] = true; + require_once(BB2_CORE . "/safari.inc.php"); + bb2_test($settings, $package, bb2_safari($package)); + } elseif (stripos($ua, "Lynx") !== FALSE) { + $package['is_browser'] = true; + require_once(BB2_CORE . "/lynx.inc.php"); + bb2_test($settings, $package, bb2_lynx($package)); + } elseif (stripos($ua, "MovableType") !== FALSE) { + require_once(BB2_CORE . "/movabletype.inc.php"); + bb2_test($settings, $package, bb2_movabletype($package)); + } elseif (stripos($ua, "msnbot") !== FALSE || stripos($ua, "MS Search") !== FALSE) { + require_once(BB2_CORE . "/msnbot.inc.php"); + bb2_test($settings, $package, bb2_msnbot($package)); + } elseif (stripos($ua, "Googlebot") !== FALSE || stripos($ua, "Mediapartners-Google") !== FALSE) { + require_once(BB2_CORE . "/google.inc.php"); + bb2_test($settings, $package, bb2_google($package)); + } elseif (stripos($ua, "Mozilla") !== FALSE && stripos($ua, "Mozilla" == 0)) { + $package['is_browser'] = true; + require_once(BB2_CORE . "/mozilla.inc.php"); + bb2_test($settings, $package, bb2_mozilla($package)); + } + + // More intensive screening applies to POST requests + if (!strcasecmp('POST', $package['request_method'])) { + require_once(BB2_CORE . "/post.inc.php"); + bb2_test($settings, $package, bb2_post($settings, $package)); + } + } + + // Last chance screening. + require_once(BB2_CORE . "/screener.inc.php"); + bb2_screener($settings, $package); + + // And that's about it. + bb2_approved($settings, $package); + return true; +} +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/functions.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/functions.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/functions.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,69 @@ +<?php if (!defined('BB2_CORE')) die("I said no cheating!"); + +// Miscellaneous helper functions. + +// stripos() needed because stripos is only present on PHP 5 +if (!function_exists('stripos')) { + function stripos($haystack,$needle,$offset = 0) { + return(strpos(strtolower($haystack),strtolower($needle),$offset)); + } +} + +// str_split() needed because str_split is only present on PHP 5 +if (!function_exists('str_split')) { + function str_split($string, $split_length=1) + { + if ($split_length < 1) { + return false; + } + + for ($pos=0, $chunks = array(); $pos < strlen($string); $pos+=$split_length) { + $chunks[] = substr($string, $pos, $split_length); + } + return $chunks; + } +} + +// Convert a string to mixed-case on word boundaries. +function uc_all($string) { + $temp = preg_split('/(\W)/', str_replace("_", "-", $string), -1, PREG_SPLIT_DELIM_CAPTURE); + foreach ($temp as $key=>$word) { + $temp[$key] = ucfirst(strtolower($word)); + } + return join ('', $temp); +} + +// Determine if an IP address resides in a CIDR netblock or netblocks. +function match_cidr($addr, $cidr) { + $output = false; + + if (is_array($cidr)) { + foreach ($cidr as $cidrlet) { + if (match_cidr($addr, $cidrlet)) { + $output = true; + } + } + } else { + list($ip, $mask) = explode('/', $cidr); + $mask = 0xffffffff << (32 - $mask); + $output = ((ip2long($addr) & $mask) == (ip2long($ip) & $mask)); + } + return $output; +} + +// Obtain all the HTTP headers. +// NB: on PHP-CGI we have to fake it out a bit, since we can't get the REAL +// headers. Run PHP as Apache 2.0 module if possible for best results. +function bb2_load_headers() { + if (!is_callable('getallheaders')) { + $headers = array(); + foreach ($_SERVER as $h => $v) + if (ereg('HTTP_(.+)', $h, $hp)) + $headers[str_replace("_", "-", uc_all($hp[1]))] = $v; + } else { + $headers = getallheaders(); + } + return $headers; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/google.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/google.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/google.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,13 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Analyze user agents claiming to be Googlebot + +function bb2_google($package) +{ + if (match_cidr($package['ip'], "66.249.64.0/19") === FALSE && match_cidr($package['ip'], "64.233.160.0/19") === FALSE) { + return "f1182195"; + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/housekeeping.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/housekeeping.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/housekeeping.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,16 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +function bb2_housekeeping($settings, $package) +{ + // FIXME Yes, the interval's hard coded (again) for now. + $query = "DELETE FROM `" . $settings['log_table'] . "` WHERE `date` < DATE_SUB('" . bb2_db_date() . "', INTERVAL 7 DAY)"; + bb2_db_query($query); + + // Waste a bunch more of the spammer's time, sometimes. + if (rand(1,1000) == 1) { + $query = "OPTIMIZE TABLE `" . $settings['log_table'] . "`"; + bb2_db_query($query); + } +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/index.html =================================================================== Added: main/trunk/extras/Bad-Behavior/bad-behavior/konqueror.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/konqueror.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/konqueror.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,17 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Analyze user agents claiming to be Konqueror + +function bb2_konqueror($package) +{ + // CafeKelsa is a dev project at Yahoo which indexes job listings for + // Yahoo! HotJobs. It identifies as Konqueror so we skip these checks. + if (stripos($package['headers_mixed']['User-Agent'], "YahooSeeker/CafeKelsa") === FALSE || match_cidr($package['ip'], "209.73.160.0/19") === FALSE) { + if (!array_key_exists('Accept', $package['headers_mixed'])) { + return "17566707"; + } + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/lynx.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/lynx.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/lynx.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,13 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Analyze user agents claiming to be Lynx + +function bb2_lynx($package) +{ + if (!array_key_exists('Accept', $package['headers_mixed'])) { + return "17566707"; + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/movabletype.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/movabletype.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/movabletype.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,14 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +function bb2_movabletype($package) +{ + // Is it a trackback? + if (strcasecmp($package['request_method'], "POST")) { + if (strcmp($package['headers_mixed']['Range'], "bytes=0-99999")) { + return "7d12528e"; + } + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/mozilla.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/mozilla.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/mozilla.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,19 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Analyze user agents claiming to be Mozilla + +function bb2_mozilla($package) +{ + // First off, workaround for Google Desktop, until they fix it FIXME + // Google Desktop fixed it, but apparently some old versions are + // still out there. :( + // Always check accept header for Mozilla user agents + if (strpos($package['headers_mixed']['User-Agent'], "Google Desktop") === FALSE) { + if (!array_key_exists('Accept', $package['headers_mixed'])) { + return "17566707"; + } + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/msie.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/msie.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/msie.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,24 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Analyze user agents claiming to be MSIE + +function bb2_msie($package) +{ + if (!array_key_exists('Accept', $package['headers_mixed'])) { + return "17566707"; + } + + // MSIE does NOT send "Windows ME" or "Windows XP" in the user agent + if (strpos($package['headers_mixed']['User-Agent'], "Windows ME") !== FALSE || strpos($package['headers_mixed']['User-Agent'], "Windows XP") !== FALSE || strpos($package['headers_mixed']['User-Agent'], "Windows 2000") !== FALSE || strpos($package['headers_mixed']['User-Agent'], "Win32") !== FALSE) { + return "a1084bad"; + } + + // MSIE does NOT send Connection: TE + if (preg_match('/\bTE\b/i', $package['headers_mixed']['Connection'])) { + return "2b90f772"; + } + + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/msnbot.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/msnbot.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/msnbot.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,13 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Analyze user agents claiming to be msnbot + +function bb2_msnbot($package) +{ + if (match_cidr($package['ip'], "207.46.0.0/16") === FALSE && match_cidr($package['ip'], "65.52.0.0/14") === FALSE && match_cidr($package['ip'], "207.68.128.0/18") === FALSE && match_cidr($package['ip'], "207.68.192.0/20") === FALSE && match_cidr($package['ip'], "64.4.0.0/18") === FALSE) { + return "e4de0453"; + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/opera.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/opera.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/opera.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,13 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Analyze user agents claiming to be Opera + +function bb2_opera($package) +{ + if (!array_key_exists('Accept', $package['headers_mixed'])) { + return "17566707"; + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/post.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/post.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/post.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,68 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// All tests which apply specifically to POST requests +function bb2_post($settings, $package) +{ + // Check blackhole lists for known spam/malicious activity + require_once(BB2_CORE . "/blackhole.inc.php"); + bb2_test($settings, $package, bb2_blackhole($package)); + + // MovableType needs specialized screening + if (stripos($package['headers_mixed']['User-Agent'], "MovableType") !== FALSE) { + if (strcmp($package['headers_mixed']['Range'], "bytes=0-99999")) { + return "7d12528e"; + } + } + + // Trackbacks need special screening + $request_entity = $package['request_entity']; + if (isset($request_entity['title']) && isset($request_entity['url']) && isset($request_entity['blog_name'])) { + require_once(BB2_CORE . "/trackback.inc.php"); + return bb2_trackback($package); + } + + // Catch a few completely broken spambots + foreach ($request_entity as $key => $value) { + $pos = strpos($key, " document.write"); + if ($pos !== FAlSE) { + return "dfd9b1ad"; + } + } + + // Screen by cookie/JavaScript form add + if (isset($_COOKIE[BB2_COOKIE])) { + $screener1 = explode(" ", $_COOKIE[BB2_COOKIE]); + } + if (isset($_POST[BB2_COOKIE])) { + $screener2 = explode(" ", $_POST[BB2_COOKIE]); + } + $screener = max($screener1[0], $screener2[0]); + + if ($screener > 0) { + // Posting too fast? 5 sec + // FIXME: even 5 sec is too intrusive + // if ($screener + 5 > time()) + // return "408d7e72"; + // Posting too slow? 48 hr + if ($screener + 172800 < time()) + return "b40c8ddc"; + + // Screen by IP address + $ip = ip2long($package['ip']); + $ip_screener = ip2long($screener[1]); +// FIXME: This is b0rked, but why? +// if ($ip && $ip_screener && abs($ip_screener - $ip) > 256) +// return "c1fa729b"; + + // Screen for user agent changes + // User connected previously with blank user agent + $q = bb2_db_query("SELECT `ip` FROM " . $settings['log_table'] . " WHERE (`ip` = '" . $package['ip'] . "' OR `ip` = '" . $screener[1] . "') AND `user_agent` != '" . $package['user_agent'] . "' AND `date` > DATE_SUB('" . bb2_db_date() . "', INTERVAL 5 MINUTE)"); + // Damnit, too many ways for this to fail :( + if ($q !== FALSE && $q != NULL && bb2_db_num_rows($q) > 0) + return "799165c2"; + } + + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/responses.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/responses.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/responses.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,44 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Defines the responses which Bad Behavior might return. + +function bb2_get_response($key) { + $bb2_responses = array( + '00000000' => array('response' => 200, 'explanation' => '', 'log' => ''), + '136673cd' => array('response' => 403, 'explanation' => 'Your Internet Protocol address is listed on a blacklist of addresses involved in malicious or illegal activity. See the listing below for more details on specific blacklists and removal procedures.', 'log' => 'IP address found on external blacklist'), + '17566707' => array('response' => 403, 'explanation' => 'An invalid request was received from your browser. This may be caused by a malfunctioning proxy server or browser privacy software.', 'log' => 'Required header \'Accept\' missing'), + '17f4e8c8' => array('response' => 403, 'explanation' => 'You do not have permission to access this server.', 'log' => 'User-Agent was found on blacklist'), + '21f11d3f' => array('response' => 403, 'explanation' => 'An invalid request was received. You claimed to be a mobile Web device, but you do not actually appear to be a mobile Web device.', 'log' => 'User-Agent claimed to be AvantGo, claim appears false'), + '2b90f772' => array('response' => 403, 'explanation' => 'You do not have permission to access this server. If you are using the Opera browser, then Opera must appear in your user agent.', 'log' => 'Connection: TE present, not supported by MSIE'), + '408d7e72' => array('response' => 403, 'explanation' => 'You do not have permission to access this server. Before trying again, run anti-virus and anti-spyware software and remove any viruses and spyware from your computer.', 'log' => 'POST comes too quickly after GET'), + '41feed15' => array('response' => 400, 'explanation' => 'An invalid request was received. This may be caused by a malfunctioning proxy server. Bypass the proxy server and connect directly, or contact your proxy server administrator.', 'log' => 'Header \'Pragma\' without \'Cache-Control\' prohibited for HTTP/1.1 requests'), + '45b35e30' => array('response' => 403, 'explanation' => 'An invalid request was received from your browser. This may be caused by a malfunctioning proxy server or browser privacy software.', 'log' => 'Header \'Referer\' is corrupt'), + '57796684' => array('response' => 403, 'explanation' => 'You do not have permission to access this server. Before trying again, run anti-virus and anti-spyware software and remove any viruses and spyware from your computer.', 'log' => 'Prohibited header \'X-Aaaaaaaaaa\' or \'X-Aaaaaaaaaaaa\' present'), + '582ec5e4' => array('response' => 400, 'explanation' => 'An invalid request was received. If you are using a proxy server, bypass the proxy server or contact your proxy server administrator. This may also be caused by a bug in the Opera web browser.', 'log' => '"Header \'TE\' present but TE not specified in \'Connection\' header'), + '69920ee5' => array('response' => 403, 'explanation' => 'An invalid request was received from your browser. This may be caused by a malfunctioning proxy server or browser privacy software.', 'log' => 'Header \'Referer\' present but blank'), + '799165c2' => array('response' => 403, 'explanation' => 'You do not have permission to access this server.', 'log' => 'Rotating user-agents detected'), + '7a06532b' => array('response' => 400, 'explanation' => 'An invalid request was received from your browser. This may be caused by a malfunctioning proxy server or browser privacy software.', 'log' => 'Required header \'Accept-Encoding\' missing'), + '7ad04a8a' => array('response' => 400, 'explanation' => 'The automated program you are using is not permitted to access this server. Please use a different program or a standard Web browser.', 'log' => 'Prohibited header \'Range\' present'), + '7d12528e' => array('response' => 403, 'explanation' => 'You do not have permission to access this server.', 'log' => 'Prohibited header \'Range\' or \'Content-Range\' in POST request'), + '939a6fbb' => array('response' => 403, 'explanation' => 'The proxy server you are using is not permitted to access this server. Please bypass the proxy server, or contact your proxy server administrator.', 'log' => 'Banned proxy server in use'), + '9c9e4979' => array('response' => 403, 'explanation' => 'The proxy server you are using is not permitted to access this server. Please bypass the proxy server, or contact your proxy server administrator.', 'log' => 'Prohibited header \'via\' present'), + 'a0105122' => array('response' => 417, 'explanation' => 'Expectation failed. Please retry your request.', 'log' => 'Header \'Expect\' prohibited; resend without Expect'), + 'a1084bad' => array('response' => 403, 'explanation' => 'You do not have permission to access this server.', 'log' => 'User-Agent claimed to be MSIE, with invalid Windows version'), + 'a52f0448' => array('response' => 400, 'explanation' => 'An invalid request was received. This may be caused by a malfunctioning proxy server or browser privacy software. If you are using a proxy server, bypass the proxy server or contact your proxy server administrator.', 'log' => 'Header \'Connection\' contains invalid values'), + 'b40c8ddc' => array('response' => 403, 'explanation' => 'You do not have permission to access this server. Before trying again, close your browser, run anti-virus and anti-spyware software and remove any viruses and spyware from your computer.', 'log' => 'POST more than two days after GET'), + 'b7830251' => array('response' => 400, 'explanation' => 'Your proxy server sent an invalid request. Please contact the proxy server administrator to have this problem fixed.', 'log' => 'Prohibited header \'Proxy-Connection\' present'), + 'b9cc1d86' => array('response' => 403, 'explanation' => 'The proxy server you are using is not permitted to access this server. Please bypass the proxy server, or contact your proxy server administrator.', 'log' => 'Prohibited header \'X-Aaaaaaaaaa\' or \'X-Aaaaaaaaaaaa\' present'), + 'c1fa729b' => array('response' => 403, 'explanation' => 'You do not have permission to access this server. Before trying again, run anti-virus and anti-spyware software and remove any viruses and spyware from your computer.', 'log' => 'Use of rotating proxy servers detected'), + 'd60b87c7' => array('response' => 403, 'explanation' => 'You do not have permission to access this server. Before trying again, please remove any viruses or spyware from your computer.', 'log' => 'Trackback received via proxy server'), + 'dfd9b1ad' => array('response' => 403, 'explanation' => 'You do not have permission to access this server.', 'log' => 'Request contained a malicious JavaScript or SQL injection attack'), + 'e4de0453' => array('response' => 403, 'explanation' => 'An invalid request was received. You claimed to be a major search engine, but you do not appear to actually be a major search engine.', 'log' => 'User-Agent claimed to be msnbot, claim appears to be false'), + 'e87553e1' => array('response' => 403, 'explanation' => 'You do not have permission to access this server.', 'log' => 'I know you and I don\'t like you, dirty spammer.'), + 'f0dcb3fd' => array('response' => 403, 'explanation' => 'You do not have permission to access this server. Before trying again, run anti-virus and anti-spyware software and remove any viruses and spyware from your computer.', 'log' => 'Web browser attempted to send a trackback'), + 'f1182195' => array('response' => 403, 'explanation' => 'An invalid request was received. You claimed to be a major search engine, but you do not appear to actually be a major search engine.', 'log' => 'User-Agent claimed to be Googlebot, claim appears to be false.'), + 'f9f2b8b9' => array('response' => 403, 'explanation' => 'You do not have permission to access this server. This may be caused by a malfunctioning proxy server or browser privacy software.', 'log' => 'A User-Agent is required but none was provided.'), + ); + + if (array_key_exists($key, $bb2_responses)) return $bb2_responses[$key]; + return array('00000000'); +} +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/safari.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/safari.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/safari.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,13 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Analyze user agents claiming to be Safari + +function bb2_safari($package) +{ + if (!array_key_exists('Accept', $package['headers_mixed'])) { + return "17566707"; + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/screener.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/screener.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/screener.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,63 @@ +<?php if (!defined('BB2_CWD')) die("I said no cheating!"); + +// Bad Behavior browser screener + +function bb2_screener_cookie($settings, $package, $cookie_name, $cookie_value) +{ + // FIXME: Set the real cookie + setcookie($cookie_name, $cookie_value, 0, bb2_relative_path()); +} + +function bb2_screener_javascript($settings, $package, $cookie_name, $cookie_value) +{ + global $bb2_javascript; + + // FIXME: do something + $bb2_javascript = "<script type=\"text/javascript\"> +<!-- +function bb2_addLoadEvent(func) { + var oldonload = window.onload; + if (typeof window.onload != 'function') { + window.onload = func; + } else { + window.onload = function() { + oldonload(); + func(); + } + } +} + +bb2_addLoadEvent(function() { + for ( i=0; i < document.forms.length; i++ ) { + if (document.forms[i].method == 'post') { + var myElement = document.createElement('input'); + myElement.setAttribute('type', 'hidden'); + myElement.name = '$cookie_name'; + myElement.value = '$cookie_value'; + document.forms[i].appendChild(myElement); + } + } +}); +// --></script> + "; +} + +function bb2_screener($settings, $package) +{ + $cookie_name = BB2_COOKIE; + + // Set up a simple cookie + $screener = array(time(), $package['ip']); + if (isset($package['headers_mixed']['X-Forwarded-For'])) { + array_push($screener, $package['headers_mixed']['X-Forwarded-For']); + } + if (isset($package['headers_mixed']['Client-Ip'])) { + array_push($screener, $package['headers_mixed']['Client-Ip']); + } + + $cookie_value = implode(" ", $screener); + + bb2_screener_cookie($settings, $package, BB2_COOKIE, $cookie_value); + bb2_screener_javascript($settings, $package, BB2_COOKIE, $cookie_value); +} +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/trackback.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/trackback.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/trackback.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,18 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +// Specialized screening for trackbacks +function bb2_trackback($package) +{ + // Web browsers don't send trackbacks + if ($package['is_browser']) { + return 'f0dcb3fd'; + } + + // Proxy servers don't send trackbacks either + if (array_key_exists('Via', $package['headers_mixed']) || array_key_exists('Max-Forwards', $package['headers_mixed']) || array_key_exists('X-Forwarded-For', $package['headers_mixed']) || array_key_exists('Client-Ip', $package['headers_mixed'])) { + return 'd60b87c7'; + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/version.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/version.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/version.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,3 @@ +<?php if (!defined('BB2_CWD')) die("I said no cheating!"); +define('BB2_VERSION', "2.0.8"); +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior/whitelist.inc.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior/whitelist.inc.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior/whitelist.inc.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,57 @@ +<?php if (!defined('BB2_CORE')) die('I said no cheating!'); + +function bb2_whitelist($package) +{ + // DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! + + // Inappropriate whitelisting WILL expose you to spam, or cause Bad + // Behavior to stop functioning entirely! DO NOT WHITELIST unless you + // are 100% CERTAIN that you should. + + // IP address ranges use the CIDR format. + + // Includes four examples of whitelisting by IP address and netblock. + $bb2_whitelist_ip_ranges = array( + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16", +// "127.0.0.1", + "208.54.95.129", + ); + + // DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! + + // Inappropriate whitelisting WILL expose you to spam, or cause Bad + // Behavior to stop functioning entirely! DO NOT WHITELIST unless you + // are 100% CERTAIN that you should. + + // You should not whitelist search engines by user agent. Use the IP + // netblock for the search engine instead. See http://whois.arin.net/ + // to locate the netblocks for an IP. + + // User agents are matched by exact match only. + + // Includes one example of whitelisting by user agent. + // All are commented out. + $bb2_whitelist_user_agents = array( + // "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) It's me, let me in", + ); + + // DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! + + // Do not edit below this line + + if (!empty($bb2_whitelist_ip_ranges)) { + foreach ($bb2_whitelist_ip_ranges as $range) { + if (match_cidr($package['ip'], $range)) return true; + } + } + if (!empty($bb2_whitelist_user_agents)) { + foreach ($bb2_whitelist_user_agents as $user_agent) { + if (!strcmp($package['headers_mixed']['User-Agent'], $user_agent)) return true; + } + } + return false; +} + +?> Added: main/trunk/extras/Bad-Behavior/bad-behavior-phpBBreloaded.php =================================================================== --- main/trunk/extras/Bad-Behavior/bad-behavior-phpBBreloaded.php (rev 0) +++ main/trunk/extras/Bad-Behavior/bad-behavior-phpBBreloaded.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,140 @@ +<?php +/* +Bad Behavior - detects and blocks unwanted Web accesses +Copyright (C) 2005-2006 Michael Hampton + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +As a special exemption, you may link this program with any of the +programs listed below, regardless of the license terms of those +programs, and distribute the resulting program, without including the +source code for such programs: ExpressionEngine + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Please report any problems to badbots AT ioerror DOT us +*/ + +############################################################################### +############################################################################### + +define('BB2_CWD', dirname(__FILE__)); + +// Settings you can adjust for Bad Behavior. +// Most of these are unused in non-database mode. +$bb2_settings_defaults = array( + 'log_table' => 'bad_behavior', + 'display_stats' => true, + 'strict' => false, + 'verbose' => false +); + +// Bad Behavior callback functions. + +// Return current time in the format preferred by your database. +function bb2_db_date() { + return gmdate('Y-m-d H:i:s'); // Example is MySQL format +} + +// Return affected rows from most recent query. +function bb2_db_affected_rows() { + return false; +} + +// Escape a string for database usage +function bb2_db_escape($string) { + // return mysql_real_escape_string($string); + return $string; // No-op when database not in use. +} + +// Return the number of rows in a particular query. +function bb2_db_num_rows($result) { + if ($result !== FALSE) + return count($result); + return 0; +} + +// Run a query and return the results, if any. +// Should return FALSE if an error occurred. +// Bad Behavior will use the return value here in other callbacks. +function bb2_db_query($query) { + return FALSE; +} + +// Return all rows in a particular query. +// Should contain an array of all rows generated by calling mysql_fetch_assoc() +// or equivalent and appending the result of each call to an array. +function bb2_db_rows($result) { + return $result; +} + +// Return emergency contact email address. +function bb2_email() { + // return "ex...@ex..."; // You need to change this. + return "ba...@io..."; // You need to change this. +} + +// retrieve settings from database +// Settings are hard-coded for non-database use +function bb2_read_settings() { + global $bb2_settings_defaults; + return $bb2_settings_defaults; +} + +// write settings to database +function bb2_write_settings($settings) { + return false; +} + +// installation +function bb2_install() { + return false; +} + +// Screener +// Insert this into the <head> section of your HTML through a template call +// or whatever is appropriate. This is optional we'll fall back to cookies +// if you don't use it. +function bb2_insert_head() { + global $bb2_javascript; + echo $bb2_javascript; +} + +// Display stats? This is optional. +function bb2_insert_stats($force = false) { + $settings = bb2_read_settings(); + + if ($force || $settings['display_stats']) { + $blocked = bb2_db_query("SELECT COUNT(*) FROM " . $settings['log_table'] . " WHERE `key` NOT LIKE '00000000'"); + if ($blocked !== FALSE) { + echo sprintf('<p><a href="http://www.homelandstupidity.us/software/bad-behavior/">%1$s</a> %2$s <strong>%3$s</strong> %4$s</p>', __('Bad Behavior'), __('has blocked'), $blocked[0]["COUNT(*)"], __('access attempts in the last 7 days.')); + } + } +} + +// Return the top-level relative path of wherever we are (for cookies) +// You should provide in $url the top-level URL for your site. +function bb2_relative_path() { + //$url = parse_url(get_bloginfo('url')); + //return $url['path'] . '/'; + return '/'; +} + +// Calls inward to Bad Behavor itself. +require_once(BB2_CWD . "/bad-behavior/version.inc.php"); +require_once(BB2_CWD . "/bad-behavior/core.inc.php"); +bb2_install(); // FIXME: see above + +bb2_start(bb2_read_settings()); + +?> Added: main/trunk/extras/Bad-Behavior/index.html =================================================================== Added: main/trunk/extras_config.php =================================================================== --- main/trunk/extras_config.php (rev 0) +++ main/trunk/extras_config.php 2006-12-31 16:08:16 UTC (rev 282) @@ -0,0 +1,68 @@ +<?php +/******************************************************************************* + * extras_config.php + * ------------------- + * begin : Sunday, Dec 31, 2006 + * copyright : (C) 2006 The phpBBreloaded Group + * website : www.phpbbreloaded.org + * + * $Id: extras_config.php,v 1.0 2006/12/30 14:46:59 mjnr Exp $ + * + ******************************************************************************/ + +/******************************************************************************* + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + ******************************************************************************/ + +/******************************************************************************* + * Use this file to configure the basics for using any phpBBreloaded 'extras', + * such as location, whether to use, etc.. + * + * My suggestion is to only use the 'extras' section/folder to store addins + * that are developed independantly from the phpBBreloaded core. This will give + * us an easy avenu... [truncated message content] |