2.6. 消息数据检查

现在应该看看消息本身的内容了。这是传统垃圾邮件和病毒扫描器所做的事情,因为它们通常在消息被接受后才对其进行操作。然而,在我们的例子中,我们在发出最终的 250 响应之前执行这些检查,这样我们就有机会当场拒绝邮件,而不是稍后生成附带垃圾邮件

如果您的入站邮件交换器非常繁忙(即大型站点,少量机器),您可能会发现直接在邮件交换器中执行部分或全部这些检查成本太高。特别是,运行病毒扫描器垃圾邮件扫描器确实会占用相当多的 CPU 带宽和时间。

如果是这样,您将需要为这些扫描操作设置专用机器。大多数服务器端反垃圾邮件和反病毒软件可以通过网络(即从您的邮件交换器)调用。在接下来的章节中,我们将更详细地讨论各种 MTA 的实现。

2.6.1. 标头检查

2.6.1.1. 缺少标头行

RFC 2822 规定消息应该至少包含以下标头行

From: ...
To: ...
Subject: ...
Message-ID: ...
Date: ...

缺少任何这些行意味着该消息不是由主流的 邮件用户代理 生成的,并且很可能是垃圾邮件[1]

2.6.1.2. 标头地址语法检查

消息标头中出现的地址(即 To:Cc:From: ... 字段)在语法上应该是有效的。无需多言。

2.6.1.3. 简单标头地址验证

对于消息标头中的每个地址

  • 如果地址是本地地址,则本地部分(@ 符号之前)是否是有效的邮箱?

  • 如果地址是远程地址,则域部分(@ 符号之后)是否存在?

2.6.1.4. 标头地址回拨验证

这与发件人回拨验证收件人回拨验证类似。通过调用相应域的主 MX 来验证每个远程标头地址,以确定是否会接受传递状态通知

2.6.2. 垃圾邮件签名存储库

垃圾邮件的一个特点是它被发送到大量地址。如果其他 50 个收件人已经将特定消息标记为垃圾邮件,为什么您不能使用这个事实来决定是否接受发送给您的消息?更好的是,为什么不设置垃圾邮件陷阱来提供已知的垃圾邮件公共池?

我很高兴你问了。事实证明,这样的池确实存在

这些工具已经超越了简单的签名检查,这些检查仅在您收到已知为垃圾邮件的消息的完全相同的副本时才会触发。相反,它们评估常见模式,以解释消息标头和正文中的细微变化。

2.6.3. 二进制垃圾字符检查

包含非打印字符的消息很少见。当它们出现时,该消息几乎总是病毒,或者在某些情况下是用非西方语言编写的垃圾邮件,而没有适当的 MIME 编码。

一个特殊的情况是消息包含 NUL 字符(序号为零)。即使您认为弄清楚非打印字符的含义比有益更复杂,您也可以考虑检查此字符。这是因为某些邮件投递代理,例如Cyrus 邮件套件,最终会拒绝包含它的邮件。[2]。如果您使用此类软件,您绝对应该考虑摆脱 NUL 字符。

另一方面,(现在已过时的)RFC 822 规范并未明确禁止消息中出现 NUL 字符。因此,作为拒绝包含它的邮件的替代方法,您可以选择在将这些字符传递到 Cyrus 之前从消息中删除这些字符。

2.6.4. MIME 检查

同样,验证入站消息的 MIME 结构可能也是值得的。MIME 解码错误或不一致情况不常发生;但当它们发生时,该消息肯定是垃圾邮件。此外,此类错误可能表明后续检查中存在潜在问题,例如文件附件检查病毒扫描器垃圾邮件扫描器

换句话说,如果 MIME 编码是非法的,则拒绝该消息。

2.6.5. 文件附件检查

您上次收到有人发送给您想要的 Windows 屏幕保护程序(".scr" 文件)或 Windows 程序信息文件(".pif")是什么时候?

考虑阻止带有 "Windows 可执行文件" 附件的消息 - 即文件名以句点开头,后跟许多三字母组合之一,例如上述文件。此检查比病毒扫描器消耗的服务器资源少得多,并且还可以捕获防病毒扫描器中尚不存在签名的新病毒。

有关此类 "文件名扩展名" 的更全面的列表,请访问:http://support.microsoft.com/default.aspx?scid=kb;EN-US;290497

2.6.6. 病毒扫描器

有许多不同的服务器端病毒扫描器可用。仅举几例

在您不愿意仅根据文件名阻止所有潜在危险文件(考虑 ".zip" 文件)的情况下,这些扫描器很有用。此外,它们还可以捕获未作为文件附件传输的病毒,例如 2004 年 3 月出现的 "Bagle.R" 病毒。

在大多数情况下,执行病毒扫描的机器不需要是您的邮件交换器。大多数这些防病毒扫描器都可以在不同的主机上通过网络连接调用。

防病毒软件主要根据已知病毒的签名集或病毒定义来检测病毒。这些需要定期更新,因为会开发出新的病毒。此外,为了获得最高的准确性,软件本身应始终保持最新。

2.6.7. 垃圾邮件扫描器

同样,反垃圾邮件软件可用于根据大量启发式方法对消息进行分类,包括其内容、标准合规性和各种网络检查,例如DNS 黑名单垃圾邮件签名存储库。最后,此类软件通常为每条消息分配一个综合 "分数",指示消息是垃圾邮件的可能性,如果分数高于某个阈值,则将其归类为垃圾邮件。

两个最流行的服务器端启发式反垃圾邮件过滤器是

随着垃圾邮件发送者找到绕过各种检查的方法,这些工具正在不断发展。例如,考虑 "创造性" 拼写,例如 "GR0W lO 1NCH35"。因此,就像防病毒软件一样,如果您使用反垃圾邮件软件,您应该经常更新它以获得最高的准确性。

我使用 SpamAssassin,尽管为了最大限度地减少对机器资源的影响,它不再是我的第一道防线。在我个人地址每天约 500 次垃圾邮件传递尝试中,大约有 50 次到达 SpamAssassin 检查的点(主要是因为它们是从我的其他帐户之一转发的,因此上述检查无效)。在这 50 条消息中,大约每 2 或 3 天就有一条消息最终出现在我的收件箱中。

注释

[1]

一些特殊的 MTA,例如某些邮件列表服务器,不会自动为 "退回" 消息(传递状态通知)生成Message-ID标头。这些消息通过空的信封发件人来标识。

[2]

IMAP 协议不允许将 NUL 字符传输到邮件用户代理,因此 Cyrus 开发人员认为,处理包含它的邮件的最简单方法是拒绝它们。