Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php中正确转义电子邮件标题_Php_Email - Fatal编程技术网

如何在php中正确转义电子邮件标题

如何在php中正确转义电子邮件标题,php,email,Php,Email,我有以下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, $heade

我有以下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,所以这是复制的结果。我怀疑这很容易受到攻击,因为人们可能只是在email address字段中插入一个换行字符,然后为我重写整个邮件标题

我该如何正确地逃避这一点? 当您进行验证时,您是否看到其他错误/漏洞?

添加电子邮件验证:

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

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

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


安全电子邮件服务器通过端口465和587接受smtp邮件提交。这些端口是安全的smtp端口,大多数电子邮件服务器都支持这些端口

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

$filtered\u email=filter\u var(trim($email),filter\u SANITIZE\u email);
$headers='来自:system@myserver.com' . “\r\n”;
如果($U电子邮件){
$headers.=“回复:”.$filtered\u电子邮件。“\r\n”;
}
filter\u var
的文档说明,如果失败,它可能返回
false
,因此我将它放在
if
语句中(也应该将其作为空字符串处理)


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

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