Windows VistaWindows 2003Visual Studio 2005Windows 2000Windows XP.NET 2.0C# 2.0中级开发Visual StudioWindows.NETC#
DNSBL 查找类






4.45/5 (8投票s)
一个用于将 IP 地址与 DNS 黑名单服务器(反垃圾邮件列表服务器)进行匹配查找的类。
下载源代码后,请查看历史部分,了解源代码的更新。
引言
这是一个用于查询 IP 地址在 DNS 黑色列表服务器上的类的。
背景
我需要这个类用于扫描 SMTP 日志的应用程序。
Using the Code
VerifyIP IP = new VerifyIP("91.90.8.167",new string[]
{ "sbl-xbl.spamhaus.org", "bl.spamcop.net"});
if (IP.IPAddr.Valid)
if (IP.BlackList.IsListed)
Debug.Write(IP.BlackList.VerifiedOnServer);
黑色列表服务器列表
服务器地址 | 最佳实践索引 |
access.redhawk.org | 22 |
accredit.habeas.com | 14 |
bl.deadbeef.com | 20 |
bl.spamcannibal.org | 36 |
bl.spamcop.net | 2 |
blackholes.uceb.org | 37 |
blacklist.spambag.org | 30 |
cbl.abuseat.org | 3 |
cbl.ni.bg | 38 |
cblless.anti-spam.org.cn | 35 |
combined.njabl.org | 11 |
combined.rbl.msrbl.net | 31 |
dnsbl.ahbl.org | 18 |
dnsbl.burnt-tech.com | 19 |
dnsbl.delink.net | 21 |
dnsbl.njabl.org | 10 |
dnsbl.sorbs.net | 4 |
dnsbl.tqmcube.com | 27 |
dnsbl-1.uceprotect.net | 32 |
dnsbl-2.uceprotect.net | 33 |
dnsbl-3.uceprotect.net | 34 |
dul.dnsbl.sorbs.net | 6 |
http.dnsbl.sorbs.net | 7 |
ko.tqmcube.com | 25 |
list.dsbl.org | 15 |
misc.dnsbl.sorbs.net | 9 |
multihop.dsbl.org | 16 |
no-more-funn.moensted.dk | 23 |
prc.tqmcube.com | 26 |
psbl.surriel.com | 29 |
rbl.spamlab.com | 13 |
sbl-xbl.spamhaus.org | 1 |
smtp.dnsbl.sorbs.net | 8 |
socks.dnsbl.sorbs.net | 5 |
spam.tqmcube.com | 24 |
ubl.unsubscore.com | 28 |
unconfirmed.dsbl.org | 17 |
zen.spamhaus.org | 12 |
VerifyIp 类
public class VerifyIP
{
#region Nested classes
public class exIPAddress
{
#region Private fields
private string[] _adresse;
private bool _valid;
#endregion
#region Class Properties
public bool Valid
{
get { return _valid; }
}
public string AsString
{
get
{
if (_valid)
{
string tmpstr = "";
for (int ai = 0; ai < _adresse.Length; ai++)
{
tmpstr += _adresse[ai];
if (ai < _adresse.Length - 1)
tmpstr += ".";
}
return tmpstr;
}
else
return "";
}
set
{
_adresse = value.Split(new Char[] { '.' });
if (_adresse.Length == 4)
{
try
{
_valid = true;
byte tmpx = 0;
foreach (string addsec in _adresse)
if (!byte.TryParse(addsec, out tmpx))
{
_valid = false;
break;
}
}
catch { _valid = false; }
}
else
_valid = false;
}
}
public string AsRevString
{
get
{
if (_valid)
{
string tmpstr = "";
for (int ai = _adresse.Length - 1; ai > -1; ai--)
{
tmpstr += _adresse[ai];
if (ai > 0)
tmpstr += ".";
}
return tmpstr;
}
else
return "";
}
}
public string[] AsStringArray
{
get { return _adresse; }
set
{
if (value.Length == 4)
{
try
{
_valid = true;
byte tmpx = 0;
foreach (string addsec in value)
if (!byte.TryParse(addsec, out tmpx))
{
_valid = false;
break;
}
}
catch { _valid = false; }
}
else
_valid = false;
}
}
public string[] AsRevStringArray
{
get
{
string[] tmpstrarr = new string[_adresse.Length];
for (int ai = _adresse.Length - 1; ai > 0; ai--)
{
tmpstrarr[(_adresse.Length - 1) - ai] = _adresse[ai];
}
return tmpstrarr;
}
}
public byte[] AsByteArray
{
get
{
if (_valid)
return StringToByte(_adresse);
else
return new byte[0];
}
set
{
if (value.Length == 4)
{
_adresse = ByteToString(value);
_valid = true;
}
else
_valid = false;
}
}
public byte[] AsRevByteArray
{
get
{
byte[] tmpcon = StringToByte(_adresse);
byte[] tmpbytearr = new byte[tmpcon.Length];
for (int ai = tmpcon.Length - 1; ai > 0; ai--)
{
tmpbytearr[(tmpcon.Length - 1) - ai] = tmpcon[ai];
}
return tmpbytearr;
}
}
public long AsLong
{
get
{
if (_valid)
return StringToLong(_adresse, true);
else
return 0;
}
set
{
try
{
_adresse = LongToString(value, false);
_valid = true;
}
catch { _valid = false; }
}
}
public long AsRevLong
{
get { return StringToLong(_adresse, false); }
}
#endregion
#region Contructors
public exIPAddress() { }
public exIPAddress(string address)
{
this.AsString = address;
}
public exIPAddress(string[] address)
{
this.AsStringArray = address;
}
public exIPAddress(byte[] address)
{
this.AsByteArray = address;
}
public exIPAddress(long address)
{
this.AsLong = address;
}
#endregion
#region Private methods
private byte[] StringToByte(string[] strArray)
{
try
{
byte[] tmp = new byte[strArray.Length];
for (int ia = 0; ia < strArray.Length - 1; ia++)
tmp[ia] = byte.Parse(strArray[ia]);
return tmp;
}
catch
{
return new byte[0];
}
}
private string[] ByteToString(byte[] byteArray)
{
try
{
string[] tmp = new string;
for (int ia = 0; ia < byteArray.Length - 1; ia++)
tmp[ia] = byteArray[ia].ToString();
return tmp;
}
catch
{
return new string[0];
}
}
private long StringToLong(string[] straddr, bool Revese)
{
long num = 0;
if (straddr.Length == 4)
{
try
{
if (Revese)
num = (int.Parse(straddr[0])) +
(int.Parse(straddr[1]) * 256) +
(int.Parse(straddr[2]) * 65536) +
(int.Parse(straddr[3]) * 16777216);
else
num = (int.Parse(straddr[3])) +
(int.Parse(straddr[2]) * 256) +
(int.Parse(straddr[1]) * 65536) +
(int.Parse(straddr[0]) * 16777216);
}
catch { num = 0; }
}
else
num = 0;
return num;
}
private string[] LongToString(long lngval, bool Revese)
{
string[] tmpstrarr = new string[4];
if (lngval > 0)
{
try
{
int a = (int)(lngval / 16777216) % 256;
int b = (int)(lngval / 65536) % 256;
int c = (int)(lngval / 256) % 256;
int d = (int)(lngval) % 256;
if (Revese)
{
tmpstrarr[0] = a.ToString();
tmpstrarr[1] = b.ToString();
tmpstrarr[2] = c.ToString();
tmpstrarr[3] = d.ToString();
}
else
{
tmpstrarr[3] = a.ToString();
tmpstrarr[2] = b.ToString();
tmpstrarr[1] = c.ToString();
tmpstrarr[0] = d.ToString();
}
}
catch { }
return tmpstrarr;
}
else
return tmpstrarr;
}
#endregion
}
public class BlackListed
{
#region private fields
private bool _IsListed;
private string _verifiedonserver;
#endregion
#region Class properties
public string VerifiedOnServer
{
get { return _verifiedonserver; }
}
public bool IsListed
{
get { return _IsListed; }
}
#endregion
#region Contructor
public BlackListed(bool listed, string server)
{
this._IsListed = listed;
this._verifiedonserver = server;
}
#endregion
}
#endregion
#region Private fields
private exIPAddress _ip;
private BlackListed _blacklisted = new BlackListed(false, "");
#endregion
#region Class Properties
public exIPAddress IPAddr
{
get { return _ip; }
set { _ip = value; }
}
public BlackListed BlackList
{
get { return _blacklisted; }
}
#endregion
#region Constructors
public VerifyIP(byte[] address, string[] blacklistservers)
{
_ip = new exIPAddress(address);
VerifyOnServers(blacklistservers);
}
public VerifyIP(long address, string[] blacklistservers)
{
_ip = new exIPAddress(address);
VerifyOnServers(blacklistservers);
}
public VerifyIP(string address, string[] blacklistservers)
{
_ip = new exIPAddress(address);
VerifyOnServers(blacklistservers);
}
public VerifyIP(exIPAddress address, string[] blacklistservers)
{
_ip = address;
VerifyOnServers(blacklistservers);
}
#endregion
#region Private methods
private void VerifyOnServers(string[] _blacklistservers)
{
_blacklisted = null;
if (_blacklistservers != null && _blacklistservers.Length > 0)
{
foreach (string BLSrv in _blacklistservers)
{
if (VerifyOnServer(BLSrv))
{
_blacklisted = new BlackListed(true, BLSrv);
break;
}
}
if (_blacklisted == null)
_blacklisted = new BlackListed(false, "");
}
}
private bool VerifyOnServer(string BLServer)
{
if (_ip.Valid) //If IP address is valid continue..
{
try
{
IPHostEntry ipEntry = Dns.GetHostEntry(_ip.AsRevString + "." +
BLServer); //Look up the IP address on the BLServer
ipEntry = null; //Clear the object
return true; //IP address was found on the BLServer,
//it's then listed in the black list
}
catch (System.Net.Sockets.SocketException dnserr)
{
if (dnserr.ErrorCode == 11001) // IP address not listed
return false;
else // Another error happened, put other error handling here
return false;
}
}
else
return false; //IP address is not valid
}
#endregion
}
exIPAddress 源代码的修正
将 VerifyIp
类中的 exIPAddress
类代码替换为以下代码。
新代码修复了一些循环中的“索引超出范围”问题。
public class exIPAddress
{
#region Private fields
private string[] _adresse;
private bool _valid;
#endregion
#region Class Properties
public bool Valid
{
get { return _valid; }
}
public string AsString
{
get
{
if (_valid)
{
string tmpstr = "";
for (int ai = 0; ai < _adresse.Length; ai++)
{
tmpstr += _adresse[ai];
if (ai < _adresse.Length - 1)
tmpstr += ".";
}
return tmpstr;
}
else
return "";
}
set
{
_adresse = value.Split(new Char[] { '.' });
if (_adresse.Length == 4)
{
try
{
_valid = true;
byte tmpx = 0;
foreach (string addsec in _adresse)
if (!byte.TryParse(addsec, out tmpx))
{
_valid = false;
break;
}
}
catch { _valid = false; }
}
else
_valid = false;
}
}
public string AsRevString
{
get
{
if (_valid)
{
string tmpstr = "";
for (int ai = _adresse.Length - 1; ai >= 0; ai--)
{
tmpstr += _adresse[ai];
if (ai > 0)
tmpstr += ".";
}
return tmpstr;
}
else
return "";
}
}
public string[] AsStringArray
{
get { return _adresse; }
set
{
if (value.Length == 4)
{
try
{
_valid = true;
byte tmpx = 0;
foreach (string addsec in value)
if (!byte.TryParse(addsec, out tmpx))
{
_valid = false;
break;
}
}
catch { _valid = false; }
}
else
_valid = false;
}
}
public string[] AsRevStringArray
{
get
{
string[] tmpstrarr = new string[_adresse.Length];
for (int ai = _adresse.Length - 1; ai >= 0; ai--)
{
tmpstrarr[(_adresse.Length - 1) - ai] = _adresse[ai];
}
return tmpstrarr;
}
}
public byte[] AsByteArray
{
get
{
if (_valid)
return StringToByte(_adresse);
else
return new byte[0];
}
set
{
if (value.Length == 4)
{
_adresse = ByteToString(value);
_valid = true;
}
else
_valid = false;
}
}
public byte[] AsRevByteArray
{
get
{
byte[] tmpcon = StringToByte(_adresse);
byte[] tmpbytearr = new byte[tmpcon.Length];
for (int ai = tmpcon.Length-1; ai >= 0; ai--)
{
tmpbytearr[(tmpcon.Length - 1) - ai] = tmpcon[ai];
}
return tmpbytearr;
}
}
public long AsLong
{
get
{
if (_valid)
return StringToLong(_adresse, true);
else
return 0;
}
set
{
try
{
_adresse = LongToString(value, false);
_valid = true;
}
catch { _valid = false; }
}
}
public long AsRevLong
{
get { return StringToLong(_adresse, false); }
}
#endregion
#region Contructors
public exIPAddress() { }
public exIPAddress(string address)
{
this.AsString = address;
}
public exIPAddress(string[] address)
{
this.AsStringArray = address;
}
public exIPAddress(byte[] address)
{
this.AsByteArray = address;
}
public exIPAddress(long address)
{
this.AsLong = address;
}
#endregion
#region Private methods
private byte[] StringToByte(string[] strArray)
{
try
{
byte[] tmp = new byte[strArray.Length];
for (int ia = 0; ia < strArray.Length; ia++)
tmp[ia] = byte.Parse(strArray[ia]);
return tmp;
}
catch
{
return new byte[0];
}
}
private string[] ByteToString(byte[] byteArray)
{
try
{
string[] tmp = new string;
for (int ia = 0; ia < byteArray.Length; ia++)
tmp[ia] = byteArray[ia].ToString();
return tmp;
}
catch
{
return new string[0];
}
}
private long StringToLong(string[] straddr, bool Revese)
{
long num = 0;
if (straddr.Length == 4)
{
try
{
if (Revese)
num = (int.Parse(straddr[0])) +
(int.Parse(straddr[1]) * 256) +
(int.Parse(straddr[2]) * 65536) +
(int.Parse(straddr[3]) * 16777216);
else
num = (int.Parse(straddr[3])) +
(int.Parse(straddr[2]) * 256) +
(int.Parse(straddr[1]) * 65536) +
(int.Parse(straddr[0]) * 16777216);
}
catch { num = 0; }
}
else
num = 0;
return num;
}
private string[] LongToString(long lngval, bool Revese)
{
string[] tmpstrarr = new string[4];
if (lngval > 0)
{
try
{
int a = (int)(lngval / 16777216) % 256;
int b = (int)(lngval / 65536) % 256;
int c = (int)(lngval / 256) % 256;
int d = (int)(lngval) % 256;
if (Revese)
{
tmpstrarr[0] = a.ToString();
tmpstrarr[1] = b.ToString();
tmpstrarr[2] = c.ToString();
tmpstrarr[3] = d.ToString();
}
else
{
tmpstrarr[3] = a.ToString();
tmpstrarr[2] = b.ToString();
tmpstrarr[1] = c.ToString();
tmpstrarr[0] = d.ToString();
}
}
catch { }
return tmpstrarr;
}
else
return tmpstrarr;
}
#endregion
}
历史
- 2007 年 10 月 25 日 - 发布了该类的 1 号版本
- 2007 年 10 月 26 日 - 添加了服务器列表
- 2007 年 11 月 20 日 - 修正了嵌套类
exIPAddress