. // // Alexey A.Znayev, znaeff@mail.ru, http://xbsoft.org, http://xbsoft.ru // /////////////////////////////////////////////////////////////////////////// // This file contains public class DNSBL // This class performs IP address check in spam blocking lists as described // on http://ru.wikipedia.org/wiki/RBL class DNSBL { private $_aCheckers = array( // list of checkers available for individual checking 'spamhaus' => array('.zen.spamhaus.org', true), //available for group checking with 'all' key 'spamcop' => array('.bl.spamcop.net', true), //available for group checking with 'all' key 'dsbl' => array('.list.dsbl.org', false), //not available for group checking with 'all' key 'ordb' => array('.relays.ordb.org', false), //not available for group checking with 'all' key 'sorbs' => array('.dnsbl.sorbs.net', false), //not available for group checking with 'all' key 'njabl' => array('.dnsbl.njabl.org', false) //not available for group checking with 'all' key ); // AZ - 1. Key 'all' is illegal // AZ - 2. Most of spammer IP addresses is covered by 'spamhaus' & 'spamcop' (and they are fast), // some of the rest may not work sometimes, you can make them group checking available after individual testing private $_sDefaultChecker = 'spamhaus'; /////////////////////////////////////////////////////////////////////////// // CheckSpamIP - check IP for spam in checkers : given, default or all available for group checking (may be slow) // parameters: // string $ip - ip address // string $checker - checker name or 'all' or nothing // returns: // true when IP exitsts in spam-lists of $checker or at least one of all checkers // false when not or when ip address is local or not correct public function CheckSpamIP($ip, $checker = ''){ if(empty($ip)) return false; if(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $ip) != 1) return false; $octets = explode('.', $ip); if($octets[0] == '127') return false; if($octets[0] == '10') return false; if($octets[0] == '192' && $octets[0] == '168') return false; if($octets[0] == '169' && $octets[0] == '254') return false; // ms windows if((int)$octets[0] > 255 || (int)$octets[1] > 255 || (int)$octets[2] > 255 || (int)$octets[3] > 255 ) return false; $ret_val = false; $PTR = implode(array_reverse($octets), '.'); if($checker === 'all'){ foreach(array_values($this->_aCheckers) as $c){ if($c[1]){ $ret_val = $ret_val || $this->_CheckDNSAnswer(dns_get_record($PTR . $c[0], DNS_A)); } if($ret_val) break; } }else if(array_key_exists($checker, $this->_aCheckers)){ $ret_val = $this->_CheckDNSAnswer(dns_get_record($PTR . $this->_aCheckers[$checker][0], DNS_A)); }else{ $ret_val = $this->_CheckDNSAnswer(dns_get_record($PTR . $this->_aCheckers[$this->_sDefaultChecker][0], DNS_A)); } return $ret_val; } /////////////////////////////////////////////////////////////////////////// // GetCheckers - gets list of available checker names // returns: // array of strings public function GetCheckers(){ return array_keys($this->_aCheckers); } /////////////////////////////////////////////////////////////////////////// // GetGroupCheckers - gets list of checker names available for group checking with 'all' key // returns: // array of strings public function GetGroupCheckers(){ $ret_val = array(); foreach(array_keys($this->_aCheckers) as $k) if($this->_aCheckers[$k][1]) array_push($ret_val, $k); return $ret_val; } /////////////////////////////////////////////////////////////////////////// // GetDefaultChecker - gets default checker name // returns: // string public function GetDefaultChecker(){ return $this->_sDefaultChecker; } /////////////////////////////////////////////////////////////////////////// // SetDefaultChecker - sets default checker name // parameters: // string $new_checker - new default checker name // returns: // true when success // false when failed ($new_checker is not in the list of available checker names) public function SetDefaultChecker($new_checker){ if(array_key_exists($new_checker, $this->_aCheckers)){ $this->_sDefaultChecker = $new_checker; return true; }else{ return false; } } /////////////////////////////////////////////////////////////////////////// // EnableGroupChecking - sets checker available for group checking // parameters: // string $checker - checker name // returns: // true when success ($checker is included) // false when failed ($checker is not in the list of available checker names) public function EnableGroupChecking($checker){ if(array_key_exists($checker, $this->_aCheckers)){ $this->_aCheckers[$checker][1] = true; return true; }else{ return false; } } /////////////////////////////////////////////////////////////////////////// // DisableGroupChecking - sets checker not available for group checking // parameters: // string $checker - checker name // returns: // true when success ($checker is excluded) // false when failed ($checker is not in the list of available checker names) public function DisableGroupChecking($checker){ if(array_key_exists($checker, $this->_aCheckers)){ $this->_aCheckers[$checker][1] = false; return true; }else{ return false; } } // private methods /////////////////////////////////////////////////////////////////////////// // _CheckDNSAnswer - checks DNS-server answer for 127.0.0.* values // returns: // true when success // false when failed private function _CheckDNSAnswer($dns_answer){ if(!is_array($dns_answer)) return false; $len = count($dns_answer); if($len <= 0) return false; for($i=0; $i<$len; $i++){ $obj = $dns_answer[$i]; if(!(is_object($obj) || is_array($obj))) return false; $ip_str = $obj['ip']; if(!is_string($ip_str)) return false; $pos = strpos($ip_str, '127.0.0.'); if($pos !== false) return true; } return false; } } // end of class DNSBL ?> diciembre 2010

Monthly Archives diciembre 2010

Intercambio de 2 variables sin variable auxiliar

Seguramente, a lo largo de tu vida de programador, se te ha presentado el caso de que tengas que intercambiar el valor de 2 variables. La forma más utilizada es la de usar una variable auxiliar, pero en este post te presento una manera diferente de hacerlo.

Ver más

Decora tu PC en navidad

Llega la Navidad, el ambiente festivo y un sinfín de etcéteras. Se ponen lucecitas en los árboles, en las puertas, todo muy colorido… ¿y por qué no hacer lo mismo en el ordenador?

Busca...

Ver más

Cyber araña y arañitas

He aquí una pequeña escultura realizada con componentes electrónicos.

El que se ve al final es el pequeño 555 😉

Ver más

Fotos Gigabyte en la UAL

Fantástico el día transcurrido en la Universidad de Almería por parte del personal de Gigabyte (Noelia e Iñigo) y los mejores overclockers de España (DaCoSa, Predator y Skunk). Aquí os dejo una recopilación de fotos tanto de la charla, exhibición y talleres.

Ver más

Guía: Instalación de SQL Server 2008

Siguiendo las entradas de MSDN, ha aparecido una guía muy bien detallada paso a paso de cómo instalar el SQL Server 2008 R2 en Windows Server 2008.

Ver más

Descarga video en HD y audio de YouTube

Era de esperar que tarde o temprano le dieran un estacazo a Dirpy y terminase cerrando. Buscando alguna alternativa decente para descargarnos el audio de los videos, o directamente los videos de YouTube he encontrado KeepHD.

Ver más

Cazador cazado

Las redes WIFI han proliferado de tal manera que quien tenga internet en casa y no disponga de WIFI parece que en verdad no tiene internet; no hay que hacer caso a tal frase puesto que si disponemos de dispositivos móviles (portátiles, móviles, tablet-pc …) es de cajón de madera de pino disponer de WIFI.

Los hay quien lo achaca a la crisis, otros por pura diversión, otros por el simple hecho de gorronear a cambio de coste cero, pero se ha convertido en algo normal usurpar (o hacer el intento) la señal WIFI más cercana a donde nos encontremos (generalmente… vecinos).

Quien viva ...

Ver más

Gigabyte en la UAL

El próximo jueves 16 de diciembre tendrá acto en la Universidad de Almería una conferencia (por la mañana) y un taller práctico (por la tarde) llevada a cabo tanto por gente de Gigabyte como overclockers con experiencia consolidada en España.

Ver más