屏蔽域名地址,具体看域名定义规则,有一些设计实现是需要带通配符支持的,但大体都需要分为至少两个步骤:
1、直接命中
2、分段命中
一个域名地址格式大致为:[A-Za-z][0-9A-Za-z-].[A-Za-z0-9],如:jd.cn
即一个有效的域名地址必须要有一个 “.” 分段,多个 “.” 是子级分段域名了,假设我们需要屏蔽所有jd.cn 的域名,那么只需要录入 jd.cn 域名就可以。
现在有一个 www.jd.cn,首先它无法直接命中,因为它是根域名,但分段一级一级往上退就能命中到 jd.cn 的域名,另外域名地址是大小写模糊的,所以我们我们必须的提前统一字符串的 tolower or toupper。
实现这种东西是很有价值且非常重要的东西,至于是什么就不点明白了,连这些都不清楚,说明还是太年轻了,缺少社会的毒打,不信邪的小伙子已经参与改造很多年了。
#if NETCOREAPP
[MethodImpl(MethodImplOptions.AggressiveInlining)]
#endif
public bool IsBanDomainAddress(string domain)
{
try
{
if (string.IsNullOrEmpty(domain))
return true;
var alldomains = this.firewall.Domain;
if (alldomains.Count < 1)
return false;
else
domain = domain.ToLower();
// Direct hit
if (alldomains.Contains(domain))
return true;
// Segment hit
string[] lables = domain.Split('.');
if (lables == null || lables.Length < 2)
return true;
foreach (string i in lables)
if (string.IsNullOrEmpty(i))
return true;
for (int i = 1, l = lables.Length - 1; i < l; i++)
{
string next = null;
for (int j = i; j < lables.Length; j++)
if (next == null)
next += lables[j];
else
next += '.' + lables[j];
if (next != null && alldomains.Contains(next))
return true;
}
}
catch (Exception) { }
return false;
}