这个mail()函数是否可以从头部注入安全?

Eri*_*rin 11 php security spam-prevention

我正在为网站建立一个简单的联系表格.它不连接到数据库,只是发送电子邮件.此代码是否会阻止垃圾邮件发送者使用标头注入?我有没有看到任何漏洞?

//create short variable names
$name= filter_var($_POST['Name'],FILTER_SANITIZE_STRING);
$email= filter_var($_POST['Email'],FILTER_SANITIZE_STRING, FILTER_VALIDATE_EMAIL);
$subject= filter_var($_POST['Subject'],FILTER_SANITIZE_STRING);
$message= filter_var($_POST['Message'],FILTER_SANITIZE_STRING);

//set up some static information
$toaddress = 'blah@localhost.com,blahblah@localhost.com';

$mailcontent = "Customer name: ".$name."\n".
            "Customer email: ".$email."\n".
            "Subject: ".$subject."\n\n".
            $message;

$fromaddress = "From:" . $email;

//invoke mail() function to send mail
mail($toaddress, "Website Contact Form",$mailcontent, $fromaddress);
?>
Run Code Online (Sandbox Code Playgroud)

Aln*_*tak 9

头注入依赖于能够在头变量中插入额外的换行符,这使得字符串看起来像一个新的头.

例如,允许主题值Testing\nCc: spamrecipient@example.com\n\nSome body text将导致消息头包含:

Subject: Testing
Cc: spamrecipient@example.com

Some body text
Run Code Online (Sandbox Code Playgroud)

即滥用者不仅添加了额外的收件人,而且他们也设法提供了他们自己的正文.

但是在你的情况下,它$toaddress是常量,即使$toaddress是用户提供的,它也应该由mail()函数正确消毒.

您的主题标题同样不变

$message变量是安全的,因为根据定义,这是正文,只有真正的标头后发送.

那只会离开$fromaddress,你已经在使用FILTER_VALIDATE_EMAIL那个也应该拒绝任何带有换行符的东西.

但是,您应该严格检查该测试的结果,并在结果出现时中止整个测试FALSE.因为如果验证失败,那么mail()会抱怨给出一个空白From:地址,但那里没有标题注入机会.

据我所知,这段代码实际上是安全的.


此外,恕我直言,你不应该从用户提供的电子邮件地址发送电子邮件.这将违反SPF等反垃圾邮件机制.

您应该使用From:属于您自己的域的常量值.如果您愿意,可以在Reply-To标题中使用正确清理的值,以便更容易让后续回复转到所需的地址.