【问题标题】:How to properly escape Email header in php如何在php中正确转义电子邮件标头
【发布时间】:2018-07-01 20:34:21
【问题描述】:

我有以下php代码

<?php 
$from = $_POST['email'];
$to = "myaddr@myserver.com";
$subject = "new message";
$message = "new message from ". $_POST['email'] ." >>> " .  $_POST['message'];
$headers = "From:" . $from;
mail($to,$subject,$message, $headers);

?>

我刚启动php,所以这是复制的结果。我怀疑这很容易受到攻击,因为可能只是在电子邮件地址字段中插入一个换行符并为我重写我的整个邮件标题。

我如何正确地逃避这种情况? 当您这样做时 - 您是否发现任何其他错误/漏洞?

【问题讨论】:

  • 一种可能是查看 Swiftmailer 之类的库并从源代码中学习。我 认为 PHP 确实可以防止标头注入,但我 认为 您需要将 $headers 指定为数组才能使其工作。不过不确定!
  • 这不能回答您的问题,但是许多垃圾邮件过滤器会过滤掉带有“发件人”的电子邮件,而实际上不允许来自发送电子邮件的服务器。因此,您可能应该将其设置为“something@myserver.com”并改为设置“Reply-To:”。

标签: php email


【解决方案1】:

添加电子邮件验证:

if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    //send mail after validation
    mail($to,$subject,$message, $headers);
}

【讨论】:

    【解决方案2】:

    你应该确保你的脚本连接的邮件服务器得到了适当的保护。如果脚本首先连接到远程 smtp 主机,那么它应该确保远程 smtp 主机是安全的。

    通常配置电子邮件服务器,以便通过安全的 ssl 加密通道提交电子邮件。

    安全电子邮件服务器通过端口 465 和 587 接受 smtp 邮件提交。这些端口是安全 smtp 端口,大多数电子邮件服务器都支持这些端口。 What is the difference between ports 465 and 587?

    【讨论】:

      【解决方案3】:

      这是我用来过滤电子邮件地址并将其添加为“回复”标题的内容:

      $filtered_email = filter_var(trim($email), FILTER_SANITIZE_EMAIL);
      $headers = 'From: system@myserver.com' . "\r\n";
      if ( $filtered_email ) {
          $headers .= 'Reply-To: ' . $filtered_email . "\r\n";
      }
      

      filter_var 的文档说,如果失败,它可能会返回 false,所以我把它放在 if 语句中(也应该处理它是一个空字符串)。

      正如我在评论中所说,如果“发件人:”是不是发送邮件的服务器的地址,垃圾邮件过滤器可能会阻止您的电子邮件到达目的地,因此最好使用“回复:”而是。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-09
        • 2020-10-25
        • 2014-08-23
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-05
        相关资源
        最近更新 更多