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)
头注入依赖于能够在头变量中插入额外的换行符,这使得字符串看起来像一个新的头.
例如,允许主题值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标题中使用正确清理的值,以便更容易让后续回复转到所需的地址.