Login   Register  
PHP Classes
elePHPant
Icontem

File: DNSBL.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Alexey Znaev  >  DNSBL  >  DNSBL.php  >  Download  
File: DNSBL.php
Role: Class source
Content type: text/plain
Description: DNSBL class
Class: DNSBL
Check spam IP address in DNS black lists
Author: By
Last change: Update.
Added new feature - group checking. It means that checking for 'all' key will be processed by checkers that available
for group checking only.
So if you issue "CheckSpamIP($ip, 'all')" then this ip will be checked not in all available checkers but in group available ones only.
There are 2 group available checkers by default: 'spamhaus' & 'spamcop'.
You can enable and disable group checking for any checker.
New public methods added for group checking control:
'GetGroupCheckers', 'EnableGroupChecking', 'DisableGroupChecking'.
example.php shows all changes well.
Date: 2011-06-26 09:12
Size: 6,897 bytes
 

Contents

Class file image Download
<?
///////////////////////////////////////////////////////////////////////////
//
//    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 <http://www.gnu.org/licenses/>.
//
//    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

?>