3

我有一个网络服务器,可以让我发送一封电子邮件(使用 PHP),我可以让发件人成为任何人......为什么会这样?这怎么不是安全问题?

使用 php 邮件功能。

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Jon Ives <jives@apple.com>' . "\r\n";
$headers .= 'From: Tim Cook <tcook@apple.com>' . "\r\n";

$message = 'I need you to create a clear iPhone.';

// Mail it
mail($to, $subject, $message, $headers);

在上面的示例中,我可以假装以 Tim Cook 的身份向任何人发送电子邮件,我想当您发送电子邮件时……发件人地址是可靠的……为什么欺骗发件人如此容易。

编辑


我可以使用他们的代码来防止自己收到欺骗性电子邮件吗?

还有一种方法可以从电子邮件中欺骗日期和时间吗?还是由接收服务器生成的?

例如,如果我添加

$headers .= 'Date: 2010-1-2 12:32:13' . "\r\n";
4

2 回答 2

4

您所说的是伪造的消息;可以发送,尽管收件人不太可能收到消息。有一些安全措施可以防止消息伪造:

  1. 域密钥
  2. DKIM
  3. 防晒指数
  4. 发件人ID

DomainKeys 已被弃用,取而代之的是 DKIM。两者非常相似。SO 帖子“DomainKeys 与 DKIM 之间的区别?” 描述了差异。

SPF 和 SenderID 有时会相互混淆,但它们是不同的;请参阅SPF:SPF 与 SenderID

它归结为收件人的 SMTP 服务器来实施和利用这些技术。例如,如果收到邮件但 SPF 检查失败,则该邮件将被标记为垃圾邮件,然后将进入“垃圾文件夹”,但该邮件仍被接受。更进一步,SMTP 服务器还可以验证消息的 DKIM 签名;如果验证失败,则不接受该消息。这些策略和邮件路径由接收邮件服务器/客户端确定,并且差异很大。

发件人策略框架 (SPF) / SenderID

发件人策略框架 (SPF) 是一种电子邮件验证系统,旨在通过验证发件人 IP 地址检测电子邮件欺骗(一种常见漏洞)来防止垃圾邮件。SPF 允许管理员通过在域名系统 (DNS) 中创建特定的 SPF 记录(或 TXT 记录)来指定允许哪些主机从给定域发送邮件。邮件交换器使用 DNS 来检查来自给定域的邮件是否由该域管理员批准的主机发送。

资料来源:维基百科

与 SPF 不同,SenderID 改为验证声称的责任地址 (PRA),请参阅RFC 4407

基本上,这是一个 DNS 检查,询问“IP 地址X可以为域Y发送邮件吗?”

想象一下这个场景:苏西给维多利亚写了一封信。苏西先发制人地告诉维多利亚,只有苏西的哥哥约翰和苏西自己会送信给她。所以苏西把信交给约翰,让他沿着街走,然后把信交给维多利亚。维多利亚听到敲门声,约翰拿着苏西的信。因为之前的约定,苏西接受了这封信。几天后,苏西又给维多利亚写了一封信,但约翰病了,不能送信;于是,苏西让她的邻居瑞克沿着街走,把信交给维多利亚。里克敲了敲维多利亚的门,说他有一封苏茜的信。维多利亚拒绝了这封信并且不接受它(或者也许她把它放在桌子上稍后验证它以防万一有机会成为合法的),因为她希望只有 Susie 和 John 会传递来自 Susie 的信件。

example.com 的示例 SPF 记录:

spf2.0/mfrom ptr:mx.example.com +a +ip4:192.168.1.1 -all

这条 SPF 记录表明只有来自服务器的邮件mx.example.com,所有A records属于 example.com 和 IPv4 地址的192.168.1.1邮件可以发送到 example.com 的电子邮件,不能发送其他邮件 ( -all)。

域密钥识别邮件 (DKIM) / 域密钥

我将专注于 DKIM,因为 DomainKeys 已被半弃用,但前提是相同的。

DomainKeys Identified Mail (DKIM) 是一种将域名与电子邮件消息相关联的方法,从而允许个人、角色或组织对消息承担某些责任。该关联是通过可以由接收者验证的数字签名建立的。签名者(独立于邮件的实际作者或收件人)通过在邮件的标题中添加 DKIM-Signature: 字段来声明责任。验证者使用 DNS 恢复签名者的公钥,然后验证签名与实际消息的内容是否匹配。

DKIM 与 SPF 的不同之处在于 SPF 仅与 DNS 绑定,而 DKIM 是存在于邮件本身中的签名。如果您熟悉公钥密码学的概念,那本质上就是 DKIM。发送者有一个用于加密消息的私钥;它使公钥可访问(通过 DNS TXT 记录)用于解密。

在基本术语中,DKIM 提出了一个问题,“我收到的消息真的来自发件人X吗?”

想象一下这个场景:苏西给维多利亚写了一封信。除了这封信,还有苏西设计的加密代码。苏西让瑞克把信递给维多利亚。瑞克敲了敲维多利亚的门,递上那封带有加密密码的信。在接受这封信之前,Victoria 拿出了她的“解密书”(把它想象成 WhitePages——一个可公开访问的解密代码列表,但不用于加密);她解密代码发现它实际上是 Susie 的签名,然后接受了 Rick 的消息。请记住,除非 Susie 释放她的加密密钥,否则没有人可以伪造 Susie 的签名。


有没有办法从电子邮件中欺骗日期和时间?

有点儿。发送日期如您所愿:

$headers .= 'Date: 2010-1-2 12:32:13' . "\r\n";

但是,接收 SMTP 服务器将始终在邮件上放置自己的时间戳。根据邮件服务/客户端,Date可以读取标头,或者可以读取另一个元时间戳(例如,接收 SMTP 服务器添加到标头)。

举个例子,我相信 gmail 会尊重Date发件人放置的标题 - 我看过 1970 年 1 月 1 日(Unix 时代的开始)的电子邮件。这可能是个坏主意,尤其是对于收件箱中有很多邮件的邮箱 - 邮件可能会在中间或最后的某个地方丢失。

于 2013-09-23T22:13:44.230 回答
0

远程服务器被解析为 apple.com,所以它总是会去那里。

现在远程服务器只知道你的 SMTP 地址(不关心)

并且由于发件人在电子邮件标题中被提及,因此正在使用该发件人。

结论:这就是电子邮件的工作方式。

我希望我解释得尽可能简单。

于 2013-09-23T21:27:29.937 回答