///////////////////////////////////////////////////////////////////////////
//
// DNSBL - Spam IP address checker.
// Copyright (C) 2011 Alexey A.Znayev
//
// 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 3 of the License, or
// (at your option) any later version.
//
// 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, see .
//
// 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
?>
Una de las cosas preferidas por toda persona que está sumergido en el mundillo de la electrónica es ver como algo tan insignificante, como puede ser el cambio de estado de un interruptor, puede provocar una sucesión de acontecimientos que desemboquen, por ejemplo, en una notificación en nuestro teléfono móvil. Pensando en esto último son numerosas las aplicaciones que se me están ocurriendo mientras escribo este artículo, así que mostraré los pasos iniciales para poderlas llevar a cabo.
Seguro que más de una vez has formateado tu ordenador, y tras instalar tu flamante versión de Windows/Linux, zas!! te das cuenta que te falta algún que otro driver. Aquí tenéis una ayuda para que no veáis más esa dichosa interrogación amarilla en la lista de dispositivos de Windows.
A través de Genbeta he visto el siguiente video en el cual en una máquina virtual se comenzó instalando Windows 1.0 (previa instalación necesaria de MSDOS 5.0) hasta llegar a Windows 7 (actualizando siempre a la siguiente versión de Windows, pasando por ejemplo por Windows 3.1, Windows 98, Windows XP…).
Se pueden ver cosas curiosas como por ejemplo instalar en MSDOS 5.0 el Monkey Island y el Doom II, y poder seguir ejecutándolos hasta en Windows 7; o cómo mantiene el esquema de colores establecido también en MSDOS. También observar que no todo fue siguiente -> siguiente -> siguiente ya que por ejemplo surgen problemas con el formato de disco duro entre las versiones anteriores a XP y éste mismo.
Cuando se está trabajando con el ordenador nos interesa tener todos los recursos disponibles libres, por ello Windows se espera al momento de apagar el equipo para instalar las actualizaciones que se haya descargado. No es mala ocasión, pero en el caso de trabajar con un portátil y tener que esperar cierto tiempo a que termine para recoger las cosas… personalmente me ha llegado a desquiciar, sobre todo en el caso de estos días del ServicePack1 de Windows7.
Aquí va un truquillo para poder apagar el ordenador sin que instale las actualizaciones.
Cuando alguien estudia y se tiene que enfrentar a cálculos para comprobar soluciones o simplemente llegar hasta un cierto punto más rápido, este tipo de soluciones le viene como anillo al dedo.
Cuando se formatea un ordenador o se quieren instalar unos cuantos programas de golpe… o se es una persona de costumbre y tiene los instaladores guardados, o se tiene una imagen del disco duro con todo ya instalado… o se procede a bajarse uno a uno los programas e ir instalándolos. Ninite recuerda a las versiones desatendidas que pululan por la red (es decir, tras instalarse el sistema operativo, podemos elegir qué programas instalar).
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?
Comentarios recientes