随着Internet的迅速普及,电子邮件以其快捷、方便、低成本的特点逐渐成为人们进行信息交流的主要媒介之一,但是随之而来的垃圾邮件也越来越泛滥。垃圾邮件占用了有限的存储、计算和网络资源,耗费了用户大量的处理时间,影响和干扰了用户的正常工作、生活和学习。如何有效地治理垃圾邮件是全世界共同面临的一道难题,也是互连网上目前有待解决的问题。本文首先介绍了电子邮件对人们日常生活的重要性,然后概要介绍了反垃圾邮件技术的发展历史。研究了三种过滤垃圾邮件的方法,分别是黑白名单技术、主题关键字过滤技术和贝叶斯策略,对这三种技术的设计方法做了说明,重点介绍了贝叶斯过滤技术的设计原理和实现步骤。最后总结了这几种过滤技术的不足之处和设计中遇到的难点问题。
随着Internet的极度膨胀,给人们带来了大量的信息,电子邮件使人们感受到快捷和方便,更已成为一种最快速经济的通信手段,但是互联网又是一个无政府世界,有些人利用电子邮件肆意散发邮件广告,造成很多人的邮箱垃圾成堆,有些人利用电子邮箱制造邮件炸弹,使电子邮件服务器瘫痪;更有甚者利用电子邮件来传播病毒。如此种种给许多用户带来了无尽的困扰。因此对垃圾邮件进行有效的过滤,已经成为了一个有重要意义的现实问题。目前,我国对垃圾邮件过滤研究中语义分析和文本分类方面的技术还比较落后,导致国内很多大型的电子邮件系统无法及时有效地发现和拒绝垃圾邮件,从而给用户造成巨大的伤害。更为严重的是国外很多垃圾邮件制造者利用这一缺陷,通过中国的邮件服务器发送垃圾邮件,致使很多国外ISP服务提供商封锁了中国邮件服务器的IP地址,给中国用户造成很多精神和经济损失。随着中国经济与世界经济的关系日益紧密,中外交流活动的逐渐增多,对外的电子邮件数量也急剧增加,如果中国电子邮件由于垃圾邮件问题遭到全面封杀,必将会对国内企业和组织造成巨大影响,严重组碍中国经济的发展。因此,对新的,可靠的垃圾邮件过滤技术的研究已经成为一项紧迫任务。
电子邮件表示通过电子通讯系统进行信件的书写、发送和接收。今天使用的最多的通讯系统是互联网,同时电子邮件也是互联网上最受欢迎的功能之一。通过电子邮件系统,您可以用非常低廉的价格,以非常快速的方式(几秒钟之内可以发送到世界上任何你指定的目的地),与世界上任何一个角落的网络用户联络。同时,您可以得到大量免费的新闻、专题邮件,并实现轻松的信息搜索。这是任何传统的方式也无法相比的。正是由于电子邮件的使用简易、投递迅速、收费低廉,易于保存、全球畅通无阻,使得电子邮件被广泛地应用,它使人们的交流方式得到了极大的改变。每一个申请互联网帐号的用户都会有一个电子邮件地址。它是一个很类似于用户家门牌号码的邮箱地址,或者更准确地说,相当于你在邮局租用了一个信箱。因为传统的信件是由邮递员送到你的家门口,而电子邮件则需要自己去查看信箱,只是您不用跨出家门一步。电子邮件来源于专有电子邮件系统。早在互联网流行以前很久,电子邮件就已经存在了,是在主机-多终端的主从式体系中从一台计算机终端向另一计算机终端传送文本信息的相对简单的方法而发展起来的。
经历了漫长的过程之后,它现在已经演变成为一个更加复杂并丰富得多的系统,可以传送声音、图片、图像、文档等多媒体信息,以至于如数据库或帐目报告等更加专业化的文件都可以以电子邮件附件的形式在网上分发。
“垃圾邮件”多指未经请求而发送的电子邮件,也可以是发送给与信件主题不相关的新闻组或者列表服务器的同一信件的重复邮件。国内外的技术专家和反垃圾邮件组织对“垃圾邮件”的定义如出一辙:批量发送的未征得收信人同意的电子邮件。 这些电子邮件虽然每封的信息量不一定很大,但是邮件内容不是大多数用户需要甚至是令大多数用户讨厌的。铺天盖地的宣传邮件不仅侵犯了用户的私人空间,而且干扰了大多数用户正常使用电子邮件功能,同时给用户带来了上网时间和上网资金上的浪费,因此被称为“垃圾邮件”。国际互联网上的常见名词SPAM、UCE(Unsolicited Commercial Email不请自来的商业电子邮件)和UBE(Unsolicited Bulk Email不请自来的批量电子邮件)与通常所称的垃圾邮件是一样的。反垃圾邮件技术的研究是一项长期而艰巨的任务,经历了以下几个时代:
表1-1 反垃圾邮件的历史
第一代 |
第二代 |
第三代 |
第四代 |
基础MTA控制 |
实时黑名单 |
贝叶斯过滤 |
多技术整和分层过滤 |
白名单和黑名单 |
电子签名 |
人工智能 |
|
简单的关键字搜索 |
机器语言学习 |
||
信件头测试 |
|||
标题过滤 |
|||
简单的DNS测试 |
当前的反垃圾邮件技术可以分为4大类:过滤器(Filter)、反向查询(Reverse lookup)、挑战(challenges)和密码术(cryptography),这些解决办法都可以减少垃圾邮件问题,但是都有它们的局限性。其中过滤又包括关键词过滤、黑白名单、HASH技术、基于规则的过滤、智能和概率系统、贝叶斯算法,验证查询技术分为反向查询技术、DKIM技术、SenderID技术、FairUCE技术,挑战分为挑战-响应、计算性挑战。
电子邮件可视为半结构化的文本文件。RFC822 明确的把邮件划分为两部分:第1 部分称为邮件头,邮件头中包含若干数据字段,其作用是标识邮件的重要部分,例如发送者、接收者、主题和注释。邮件头字段应出现在邮件体之前,两部分间使用一个空行分隔。第2 部分就是邮件体(body),邮件体(body)是发送用户发给接收用户邮件的内容。
电子邮件与普通信件有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中,如下图所示:
电子邮件系统主要由以下3 部分组成:MUA (Mail UserAgent),邮件用户代理,是帮助用户读和写邮件;MTA (MailTransport Agent),邮件传输代理,负责将邮件从一个服务器传到另一个服务器;MDA(MailDeliveryAgent),邮件投递代理,将邮件分发到用户的邮箱里。整个邮件传输过程如下图所示:
该系统采用Microsoft SQL Server 2000数据库,数据库的名称mail。对系统功能的分析绘制了系统总体E-R图,如图3-1所示:
为了消除数据的冗于在表中采取了主关键字。根据数据库功能模块的不同,所做需求分析的不同建立了以下表,它们分别是:
表3-1 mail数据表
字段名称 |
字段说明 |
字段类型 |
主关键字 |
mailitem |
邮件编号 |
int |
* |
mailfrom |
发件人地址 |
varchar |
|
mailto |
收件人地址 |
varchar |
|
maildate |
发件日期 |
datetime |
|
mailsubject |
邮件主题 |
varchar |
|
mailbody |
邮件内容 |
varchar |
表3-2 black_mailadd数据表
字段名称 |
字段说明 |
字段类型 |
主关键字 |
ID |
编号 |
int |
* |
Mailadd |
黑名单邮件地址 |
varchar |
表3-3 white_mailadd数据表
字段名称 |
字段说明 |
字段类型 |
主关键字 |
ID |
编号 |
int |
* |
Mailadd |
白名单邮件地址 |
varchar |
表3-4 key_word数据表
字段名称 |
字段说明 |
字段类型 |
主关键字 |
ID |
编号 |
int |
* |
word |
被过滤的关键字 |
varchar |
表3-5 drop_word数据表
字段名称 |
字段说明 |
字段类型 |
主关键字 |
ID |
编号 |
int |
* |
word |
不做分析的常用字 |
varchar |
表3-6 bayes_field数据表
字段名称 |
字段说明 |
字段类型 |
主关键字 |
ID |
编号 |
int |
* |
value |
阈值 |
int |
表3-7 hash_all数据表
字段名称 |
字段说明 |
字段类型 |
主关键字 |
ID |
编号 |
int |
* |
token |
独立字串 |
varchar |
|
good_time |
出现在合法邮件中次数 |
int |
|
good_pro |
出现在合法邮件中概率 |
float |
|
bad_time |
出现在垃圾邮件中次数 |
int |
|
bad_pro |
出现在垃圾邮件中概率 |
float |
表3-8 hash_pro数据表
字段名称 |
字段说明 |
字段类型 |
主关键字 |
ID |
编号 |
int |
* |
token |
独立字串 |
varchar |
|
token_pro |
垃圾邮件综合概率 |
float |
安装此系统所需的基本软、硬件环境为:
本系统分为三个大模块,每个大模块下有不同的功能划分,模块结构图如图4-1所示:
这个模块分为收邮件和写邮件两部分,用户可以通过这个模块收发电子邮件,完成正常邮件和垃圾邮件的接收,本系统是采用从本地数据库读取数据,为反垃圾技术的研究提供测试环境。
此模块建立了两个文件夹,分别是收件夹和垃圾邮件夹,经过过滤的正常邮件显示在收件夹中,过滤后得到的垃圾邮件显示在垃圾邮件夹中。并可以对邮件进行删除和查看操作。
此模块是本设计的核心部分,采用了黑名单、白名单、主题关键字、贝叶斯过滤技术来过滤垃圾邮件,用户可以通过过滤设置来启动和停止这些过滤规则。
通过黑名单、白名单、主题关键字、贝叶斯过滤技术完成客户端的垃圾邮件过滤,每个过滤规则在对邮件进行处理判断后,若可以确定邮件的属性,即为垃圾邮件或非垃圾邮件就可以直接把邮件显示在垃圾邮件夹和收件夹。客户端垃圾邮件过滤模型如下图所示:
黑名单是一个简单有效最常用的过滤方法,它首先检查邮件头,如果发送者在黑名单内,就拒绝接收该邮件。黑名单可以是发送垃圾邮件的服务器、开放的代理、开放的中继以及发送者邮箱地址。现在有很多组织都在做*bl(block list),将那些经常发送垃圾邮件的IP地址(甚至IP地址范围)收集在一起,做成block list。
白名单过滤的方法是在邮件过滤系统中维持一张白名单表,其中收录了用户认可的邮件地址。当收到的邮件其发送者在用户的白名单中,该邮件就被判定为正常邮件。这种方法能100%的屏蔽垃圾邮件,但是同时也会过滤掉很多第一次与收件人通信的正常邮件,而这些用户不在收件人的白名单中。
目前很多邮件接收端都采用了黑白名单的方式来处理垃圾邮件,包括MUA和MTA,当然在MTA中使用得更广泛,这样可以有效地减少服务器的负担。本文中黑名单和白名单分别是已知的垃圾邮件发送者或可信任的邮件发送者的邮件地址,这种技术手段是最传统的方式,它通过黑名单技术对垃圾邮件进行屏蔽,通过白名单技术对允许的邮件进行放行。
这种技术是根据在邮件头、邮件主题或者邮件正文中是否含有设定的关键字符来判断邮件是否为垃圾邮件,然后采取处理措施。这种技术非常简单易行,现在的邮件客户端一般都提供这种技术。根据调查显示,采用基于关键字符技术的邮件过滤器能够捕获到60%的垃圾邮件。但是这种当邮件中含有某类的关键字符时就判定邮件为垃圾邮件的技术缺点非常致命,它的误确认率特别高。例如将单词"free"设置为过滤关键字,那么所有包含有这个单词的邮件都会被过滤掉,不管这封邮件来自于你的朋友还是垃圾邮件制造者。本文中是设置要过滤的邮件标题关键字,对标题中含有这些关键字的邮件进行过滤。
第一步:通过收集大量的邮件,按规则分为垃圾邮件和非垃圾邮件,建立垃圾邮件集和非垃圾邮件集,相当于两个数据库;
第二步:提取邮件主题和邮件正文中的独立字串,如商品、易趣等作为TOKEN串,并统计提取出的TOKEN串出现的次数,即字频,按照上述方法分别处理垃圾邮件集和非垃圾邮件集中的所有邮件;
第三步:每一个邮件集对应一个哈希表,hashtable_good对应非垃圾邮件集而hashtable_bad对应垃圾邮件集。表中存储TOKEN串到字频的映射关系。如下所示:
TOKEN串 出现次数
商品 N1
易趣 N2
法轮功 N3
色情 N4
第四步:计算每个哈希表中TOKEN串出现的概率 P={(某TOKEN串的字频)/(对应哈希表的长度)};
第五步:综合考虑hashtable_good和hashtable_bad,推断当新来的邮件中出现某个TOKEN串时,该邮件作为垃圾邮件的概率。存在事件S:该邮件为垃圾邮件,t1 t2 …,tn代表TOKEN串,则P{S/ti}表示在邮件中出现TOKEN串ti时,该邮件为垃圾邮件的概率。
第六步:建立新的哈希表 hashtable_probability存储TOKEN串ti到P{S/ti}的映射,如下所示:
TOKEN串 垃圾邮件的概率
商品 P{S/t1}
易趣 P{S/t2}
法轮功 P{S/t3}
色情 P{S/t4}
重复此步骤直到得到出现某字串的邮件为垃圾邮件的概率,垃圾邮件集和非垃圾邮件集的学习过程就算结束了。根据建立的哈希表hashtable_probability可以估计一封新到的邮件为垃圾邮件的可能性,当新到一封邮件时,按照步骤生成新的TOKEN串,查询hashtable_probability得到该TOKEN串的键值。假设由该邮件共得到N个TOKEN串,t1t2t3…tn ,则hashtable_probability中对应的值为P1, P2, P3, …Pn, P{S/t1,t2,t3,…tn}表示在邮件同时出现多个TOKEN串t1,t2,t3,…tn时,该邮件为垃圾邮件的概率,由复合概率公式可得:
P{S/t1t2t3…tn}=(P1 * P2*…* Pn)/[P1 * P2*…* Pn + (1- P1 )*(1- P2)*…*(1- Pn)],当P{S/t1,t2,t3,…tn }超过预定阈值时,就可以判断该邮件为垃圾邮件。
例如:一封含有“法轮功”字样的垃圾邮件 A和 一封含有“法律”字样的非垃圾邮件B。
根据邮件A生成hashtable_ bad,该哈希表中的记录为:
法:1次
轮:1次
功:1次
计算得在本表中:
法出现的概率为0.3
轮出现的概率为0.3
功出现的概率为0.3
根据邮件B生成hashtable_good,该哈希表中的记录为:
法:1
律:1
计算得在本表中:
法出现的概率为0.5
律出现的概率为0.5
综合考虑两个哈希表,共有四个TOKEN串: 法 轮 功 律
当邮件中出现“法”时,该邮件为垃圾邮件的概率为:
P=0.3/(0.3+0.5)=0.375
出现“轮”时:
P=0.3/(0.3+0)=1
出现“功“时:
P=0.3/(0.3+0)=1
出现“律”时
P=0/(0+0.5)=0;
由此可得第三个哈希表:hashtable_probability 其数据为:
法:0.375
轮:1
功:1
律:0
当新到一封含有“功律”的邮件时,我们可得到两个TOKEN串,功 律
查询哈希表hashtable_probability可得:
P(垃圾邮件|功)=1
P(垃圾邮件|律)=0
此时该邮件为垃圾邮件的可能性为:
P=(0*1)/[0*1+(1-0)*(1-1)]=0
由此可推出该邮件为非垃圾邮件。
针对贝叶斯过滤的流程以及其所需要的功能,可以把整个过滤从功能上分为邮件预处理、贝叶斯算法实现、数据库访问、过滤主逻辑几个主要模块,系统结构如下图所示:
邮件预处理模块:这个模块主要负责读取邮件,对邮件进行编解码,去html的tag等;
贝叶斯算法模块:这个模块主要的功能是对邮件文本向量化,统计特征向量词出现的次数,分类器的训练、调整、更新,新邮件的过滤等;
数据库访问模块:在文本向量化,统计频率和计算概率时需要访问数据库,这个模块主要对数据库进行访问操作;
过滤主逻辑模块:这个模块负责调用其余各个模块的功能,实现垃圾邮件过滤处理的主逻辑。
系统服务工作流程图如图5-1所示:
进入反垃圾邮件管理系统就可直观的显示收件夹和垃圾邮件夹中邮件的数目,并可点击进入浏览邮件,如果各种过滤策略启动,收到的邮件满足黑名单、关键字、贝叶斯过滤的条件,不满足白名单过滤的条件将会被显示在垃圾邮件夹里,正常邮件会被显示在垃圾邮件夹里,邮件统计界面如图5-2所示:
被过滤后的正常邮件被显示在收件夹内,显示了寄件人、日期和邮件主题,可对邮件进行删除和内容查看操作。如图5-3所示:
此部分完成黑白名单的添加、修改、删除操作,如果收到黑名单中的地址发来的邮件就进行过滤显示在垃圾邮件夹里,如果收到白名单中的地址发来的邮件就直接显示在收件夹内,黑名单界面如下图所示:
黑名单过滤的代码如下:
rem 通过黑名单过滤
function black_leach(add)
sqlb = "select * from black_mailadd where mailadd= '"&add &"'"
set rsb = server.CreateObject("adodb.recordset")
rsb.open sqlb,conn,1
if rsb.eof then
black_leach="true" ' 不在黑名单里,不被过滤
else
black_leach="false" '在黑名单里,被过滤
end if
rsb.close
set rsb=nothing
end function
主题关键字添加界面:
完成主题关键字的添加后,如果收到的邮件标题中含有要过滤的关键字就显示在垃圾邮件夹中,方便用户有选择的查看和删除,添加完成后出现以下界面,可以向数据库中添加、修改、删除主题关键字,如图所示:
主题关键字过滤核心代码如下:
rem 对标题进行分词,并查询单词中是否有被过滤的关键字:subjectleach
function sub_leach(strf)
dim strtemp
strf=Trim(strf)
strf=strf&" "
strtemp=""
for i =1 to len(strf)
if mid(strf,i,1)<>" " then
strtemp=strtemp&mid(strf,i,1)
else
sqls="select * from key_word where word= '"& strtemp &"'"
set rss = server.createobject("adodb.recordset")
rss.open sqls,conn,1,1
if not rss.eof then
sub_leach="false" '含有关键字,被过滤
exit function
else strtemp=""
end if
end if
next
sub_leach="true" '不含有关键字,不被过滤
end function
此部分完成贝叶斯过滤阈值的设定、非垃圾邮件样本集和垃圾邮件样本集的学习,并生成哈希概率表,如果收到一封邮件,计算得到的垃圾邮件概率大于预先设定好的阈值,就把它显示在垃圾邮件夹中,阈值设置和非垃圾邮件样本集学习的界面如下:
sqld="select * from drop_word where word= '"& strtemp &"'"
set rs = server.createobject("adodb.recordset")
rs.open sqld,conn,1,1
if rs.eof then '不在drop-word里
rs.close
sqlh="select token,good_time from hash_all where token= '"& strtemp &"'"
rs.open sqlh,conn,1,3
if rs.eof then'添加到hash表里,
conn.execute" insert into hash_all(token,good_time) values('"&strtemp&"','1')"
rs("good_time")=rs("good_time")+1 'rs(good_time)的值加1
set rs = server.createobject("adodb.recordset")
sql="select good_time,good_pro from hash_all where good_time<>0"
rs.open sql,conn,1,3
r_t=rs.recordcount
do until rs.eof
i=rs("good_time")/r_t
i=int(i*1000)/1000
rs("good_pro")=i
rs.update
function make_pro
set rss=server.CreateObject("adodb.recordset")
sqls="select token,good_pro,bad_pro from hash_all "
rss.open sqls,conn,1,3
do until rss.eof
str=rss("token")
i=rss("bad_pro")/(rss("bad_pro")+rss("good_pro"))
i=int(i*1000)/1000
conn.execute "insert into hash_pro values('"&str&"','"&i&"')"
rss.movenext
loop
rss.close
end function
此模块可以启动和停止过滤策略,对四种过滤规则进行设定,界面如图5-14所示
当发送一封邮件内容是fa lun mail的邮件时,计算得到的垃圾邮件概率大于预先设定的阈值95,该邮件被显示在垃圾邮件夹中。点击邮件浏览界面中对邮件进行bayes分析的按钮可以显示bayes分析的各项指标,如下图所示:
1.对系统中需要使用的过滤参数进行集中的管理和配置。主要包括以下两个方面的内容:
(1)提供用户界面给用户修改相关参数,以完成个性化定制。
(2)在系统的使用过程中,考虑到用户的实际情况,应该方便的允许用户随时开启或关闭邮件过滤功能。
针对此问题我设计了一个参数设置模块来根据用户的需要开启关闭不同的过滤规则。
特征串选取好坏将决定最终的过滤效果。特征串词库不是静态建立的,而是根据垃圾邮件集和非垃圾邮件集动态变化的,这样才能保证其一定的智能性和不断的学习能力。因此需要考虑多种情况,准确的提取垃圾邮件集合和非垃圾邮件集合中的特征信息,从而建立比较完善的特征串词库。对英文邮件,token串的选取不能仅简单的以单词为分解目标。而应该考虑到各种变化的情况,比如字母大小写 ,字母的异化。
黑白名单技术占用较少的计算机资源,易于实施,但需要手动维护邮件地址清单,此方案在成熟的垃圾邮件解决方案中只起补充作用。
关键字过滤是一个简单但是有效的阻断绝大多数垃圾邮件的方法,其优点是简单易构造、易实现、可靠性高。而缺点是:必须经常对关键字进行更改和产生较多误报的情况。
贝叶斯算法在实际应用中需注意的方面:
些信息是很重要的,因此必须把邮件头部的不同组成部分出现的TOKEN标识出来,且其权重设置为较大值。
本系统中包括一些通用模块,这些模块以文件的形式保存,可以在其他文件中使用#include语句包含这些模块,使用其中定义的功能。比如:
conn.asp 实现到数据库的连接,代码如下:
<%
set conn=server.CreateObject("adodb.connection")
set rs=server.createobject("adodb.recordset")
set subrs=server.createobject("adodb.recordset")
str="PROVIDER=SQLOLEDB;DATA SOURCE=127.0.0.1;UID=sa;
PWD=123;DATABASE=mail"
conn.open str
%>
在设计过程中,我深刻认识到了反垃圾邮件技术研究的重要性,它对我们的工作和生活都产生着巨大的影响。我也对目前所应用到的各种反垃圾技术做了全面的了解,最后选择了三种常见的技术进行了功能设计,它们分别是黑白名单技术、主题关键字过滤技术、贝叶斯过滤技术,本文就围绕这三种技术做了详细说明并阐述了开发过程,希望通过这三种技术提高垃圾邮件的过滤率。但是由于现在很多垃圾邮件发送者也在利用各种过滤技术的漏洞发送垃圾邮件,要想做到百分之百的过滤垃圾邮件是一件不可能的事,在设计中使用的三种过滤技术也存在着各自的缺陷,还有很多难点问题,比如黑白名单地址的选取,主题关键字的选取,贝叶斯垃圾邮件集和非垃圾邮件集的搜集。当然还有很多更高效的过滤技术有待我们去研究,控制和消除垃圾邮件也不是几个人或几个组织就可以完成的,它需要全社会的共同努力,来建立一个洁净的网络空间。