我正在为网站构建一个简单的联系表单。它不连接到数据库,它只是发送电子邮件。此代码会阻止垃圾邮件发送者使用 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/