php - 这个 mail() 函数对于 header 注入(inject)是安全的吗?

标签 php security spam-prevention

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

//create short variable names
$name= filter_var($_POST['Name'],FILTER_SANITIZE_STRING);
$email= filter_var($_POST['Email'], 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);
?>

最佳答案

header 注入(inject)依赖于能够将额外的换行符插入 header 变量,这使得字符串看起来像一个新的 header 。

例如,允许主题值为 Testing\nCc: spamrecipient@example.com\n\nSome body text 将导致邮件 header 包含:

Subject: Testing
Cc: spamrecipient@example.com

Some body text

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

但是在你的情况下 $toaddress 是不变的,即使 $toaddress 是用户提供的,它也应该被 mail() 正确清理 函数。

你的主题标题同样不变

$message 变量是安全的,因为根据定义它是正文文本并且仅在真正的 header 之后发送。

那只剩下 $fromaddress,并且您已经在上面使用了 FILTER_VALIDATE_EMAIL,它也应该拒绝任何带有换行符的内容。

但是,您应该严格检查该测试的结果,如果结果为 FALSE,则中止整个测试。因为如果验证失败,那么 mail() 将提示被赋予一个空白的 From: 地址,但那里没有 header 注入(inject)机会。

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


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

您应该使用属于您自己域的常量 From: 值。如果您愿意,您可以在 Reply-To header 中使用经过正确过滤的值,以便更轻松地将后续回复发送到所需地址。

关于php - 这个 mail() 函数对于 header 注入(inject)是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11040328/

相关文章:

security - PCI 合规性 - 未经身份验证的数据库

php - 从 CLI 执行多个同时的 php 脚本

PHPMailer - 某些 SMTP 消息不发送

iphone - 如何以编程方式访问 iPhone 受信任的证书存储区?

linux - 将私钥存储在数字签名服务器上的什么位置?

iis - 如何在IIS上阻止Semalt

php - 3XX 重定向的自定义错误文档

php - 使用多个条件求和数组值

c# - 使用 Encog 框架的垃圾邮件过滤示例

c++ - 出站 SMTP 数据包捕获的最佳操作系统应用程序?