这是邮件()函数头注射安全吗?(Is this mail() function safe from

2019-06-25 11:58发布

我建立了一个网站,一个简单的联系表单。 它没有连接到数据库,它只是发送电子邮件。 请问这个代码防止垃圾邮件制造者利用头注射? 是否有我没有看到任何漏洞?

 //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); ?> 

Answer 1:

头注入依赖于能够插入额外的换行符为标题变量,这使得该字符串看起来像一个新的头。

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

Subject: Testing
Cc: spamrecipient@example.com

Some body text

即施暴者不仅增加了额外的收件人,但他们已经成功地也提供自己的正文。

不过你的情况$toaddress是恒定的,即使$toaddress已被用户提供的,应当正确地消毒mail()函数。

你的主题标题同样是不变

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

那只剩$fromaddress ,并且您已经使用FILTER_VALIDATE_EMAIL上也应该拒绝与它换行符什么。

然而,你应该严格地检查测试结果,并中止了整个事情,如果结果为FALSE 。 因为它是那么如果验证失败mail()会抱怨被赋予一个空From:地址,但没有头注入的机会在那里。

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


另外,恕我直言,你不应该从用户提供的电子邮件地址发送的电子邮件。 这将下降的反垃圾邮件机制犯规如SPF。

您应该使用恒定From:属于您自己的域值。 如果你喜欢,那么你可以在使用正确的消毒值Reply-To头,使其更容易有后续回复到所需的地址。



Answer 2:

恕我直言,你的代码是不安全的,因为你错过\r\n字符。 filter_var()只杀死那些,如果FILTER_SANITIZE_STRING是配合使用FILTER_FLAG_STRIP_LOW ,这也将筛选出下面ASCII 32任何字符:

$message= filter_var($_POST['Message'], 
                     FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);

此外, FILTER_VALIDATE_MAIL将返回一个true或false,这还没有考虑。 我建议看看这个优秀源filter_var()作为主要的PHP手册上的信息很短。


更新:由于参宿一指出,通过\n\n中的代码,这其实并不重要。



Answer 3:

不,不消毒什么。

这将是非常非常容易蒙混过关了该邮件。

我可以在一个岗位价值添加任何东西(你读)来操纵邮件。



文章来源: Is this mail() function safe from header injection?