11

I'm building a simple contact form for a website. It does not connect to a database, it just sends the email. Will this code prevent spammers from using header injections? Are there any vulnerabilities I'm not seeing?

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

3 回答 3

10

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

例如,允许主题值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_EMAILthat 也应该拒绝任何带有换行符的内容。

但是,您应该严格检查该测试的结果,如果结果为FALSE. 因为如果验证失败,mail()则会抱怨给了一个空白From:地址,但那里没有标头注入机会。

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


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

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

于 2012-06-14T20:20:50.277 回答
1

恕我直言,您的代码不安全,因为您错过了\r字符\nfilter_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将返回一个真或假,你也没有考虑。我建议查看这个优秀的源代码filter_var(),因为主要的 PHP 手册信息非常少。


更新:正如 Alnitak 指出的那样,通过\n\n代码中的 ,这实际上并不重要。

于 2012-06-14T20:59:25.810 回答
0

不,这不会消毒任何东西。

捏造那个邮件是非常非常容易的。

我可以在帖子值(您阅读的)中添加任何内容来操作邮件程序。

于 2012-06-14T19:50:14.813 回答