///////////////////////////////////////////////////////////////////////////
//
// 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.
El abanico de juegos disponibles para los móviles de hoy en día (ya sean del androide o de la manzanita) es inmenso, y más aún si echamos la vista atrás y jugamos a los juegos de antaño gracias a los emuladores. Todo está muy bien, pero existe el inconveniente de que para jugar tenemos que pulsar una serie de botones virtuales que aparecen en la pantalla, y esto conlleva que nuestros dátiles (llámense también dedos) tapan gran parte de la misma. Si te ves identificado con este problema, quizás te interese este artículo.
La verdad es que la potencia de los altavoces de los móviles de hoy en día están bastante bien, pero, ¿y si pudieramos conseguir un poco más de potencia sonora de manera sencilla? Con sus 2 altavoces integrados de 2,2 W, el Veho 360º M4 es un gran aliado allí donde queramos tener música de manera sencilla y de calidad.
USB, Firewire, mando de PSX, puerto ISA, HDMI, memorias RAM DDR, conector ATX, el Nokia Pop-Port o el viejo joystick del Atari, ….. seguramente se te vienen a la cabeza decenas de cables y/o configuraciones de conectores. Pero no tienes por qué memorizarlos todos (o ninguno) porque para ello están nuestros amigos rusos de Pinouts.ru
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.
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.
Gracias a esta placa de desarrollo para PICs, el hecho de programar estos dispositivos y comprobar su funcionamiento, será algo más sencillo. Ya no tendrás que montar en una protoboard el PIC en cuestión, con su cristal y condensadores, además de la comodidad de encontrar rápidamente cada E/S, ya que están marcadas sobre la placa.
Quien diga que no sabe qué se cuece dentro de su ordenador, es porque quiere. Hablamos de SIV, una alternativa a CPU-Z pero con tanta información… que hasta aburre 😛
Indaltronia vuelve a tener vida, esta vez en servidor propio; de esta forma esperamos no volver a tener problemas legales… hmmm.
La primera entrada que os traemos me ha servido a mi, así que supongo que a muchos más le hará falta, vamos a configurar nuestra Atheros en sistemas Linux x64, concretamente le vamos a instalar los drivers madwifi para hacer «maldades» 😀
Comentarios recientes