可以从任何人发送电子邮件的安全问题

时间:2013-09-23 21:23:29

标签: php email

我有一个网络服务器,让我发送一封电子邮件(使用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);

在上面的示例中,我可以假装发送电子邮件给蒂姆做饭给任何人,我想当你发送电子邮件时...发件人地址是可靠的......为什么欺骗发件人这么容易。 / p>

修改


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

还有办法从电子邮件中欺骗日期和时间吗?或者是接收服务器生成的?

例如,如果我添加了

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

2 个答案:

答案 0 :(得分:4)

你所说的是伪造的信息;可以发送,但收件人接收消息的可能性极小。有一些安全措施可以防止伪造信息:

  1. 域关键字
  2. DKIM
  3. SPF
  4. SenderID
  5. DomainKeys已弃用,取而代之的是DKIM。两者非常相似。 SO帖"Differences between DomainKeys vs DKIM?"描述了差异。

    SPF和SenderID有时会相互混淆,但它们是不同的;见SPF: SPF vs SenderID

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

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

      

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

    来源:Wikipedia

    与SPF相反,SenderID会验证所声称的责任地址(PRA),请参阅RFC 4407

    从基本的角度来说,这是一个DNS检查问,&#34; IP地址 X 可以为域 Y 发送邮件吗?&#34; < / strong>

    想象一下这种情况:苏西给维多利亚写了一封信。抢先一步,苏西告诉维多利亚,只有苏茜的兄弟约翰和苏西本人才会给她发信。因此,苏西把这封信交给了约翰,并告诉他要沿着街道行走并送到维多利亚。维多利亚听到敲门声,约翰收到苏西的一封信;由于之前的协议,苏西接受了这封信。几天后,苏西写了另一封信给维多利亚,但约翰病了,不能发信;所以相反,Susie要求她的邻居Rick沿着街道走这封信并送到维多利亚。里克撞上了维多利亚的门,并说他有一封来自苏西的信。维多利亚拒绝了这封信,并且不接受它(或者她可能会把它放在桌子上以便以后验证它以便有机会合法),因为她希望只有Susie和John能够送信来自苏西。

    example.com的SPF记录示例:

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

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

    DomainKeys Identified Mail(DKIM)/ DomainKeys

    我会关注DKIM,因为DomainKeys被弃用了一半,但前提是相同的。

      

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

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

    在基本条款中,DKIM会问这个问题,&#34;我收到的邮件是否真的来自发件人 X ?&#34;

    想象一下这种情况:苏西给维多利亚写了一封信。随着这封信,Susie设计了一个加密代码。苏西要求瑞克把这封信带到维多利亚。里克撞上了维多利亚的门,并用加密的密码出示了这封信。在接受这封信之前,维多利亚拿出了她的解密书&#34; (想想它就像WhitePages - 一个可公开访问的解密代码列表,但不用于加密);她解密代码,发现它实际上是Susie的签名,然后接受来自Rick的消息。请记住,除非Susie发布加密密钥,否则没有人可以伪造Susie的签名。


      

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

    有点儿。发送日期与您一样:

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

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

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

答案 1 :(得分:0)

远程服务器被解析为apple.com,因此它将始终存在。

现在所有远程服务器都知道你的SMTP地址(不是它关心的)

由于电子邮件标题中提到了发件人,因此正在使用该发件人。

结论:这就是电子邮件的工作原理。

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