【问题标题】:How can I prevent Email Header Injection in my contact form?如何防止在我的联系表单中注入电子邮件标头?
【发布时间】:2017-06-04 12:11:51
【问题描述】:

我是 PHP 新手,但我设法创建了一个有效的联系表单。但后来我知道了电子邮件标头注入。我怎样才能以最好的方式防止这种情况发生?不希望我的表单被用来向人们发送垃圾邮件。

这是我的代码:

<?php 
if ($_POST["email"]<>'') { 
    $ToEmail = 'FixedEmail@domain.com'; 
    $EmailSubject = 'Email Subject'; 
    $mailheader = 'From: donotreply@domain.com' . "\r\n" .
        'Reply-To:' .$_POST["email"]. "\r\n" .
        'MIME-Version: 1.0'."\r\n".
        'Content-Type: text/html; charset=utf-8'."\r\n".
        'X-Mailer: PHP/' . phpversion();
    $MESSAGE_BODY .= "<b>Navn:</b> ".$_POST["name"]."<br />"; 
    $MESSAGE_BODY .= "<b>Telefon:</b> ".$_POST["telephone"]."<br />";
    $MESSAGE_BODY .= "<b>Email:</b> ".$_POST["email"]."<br /><br />"; 
    $MESSAGE_BODY .= "".nl2br($_POST["message"])."<br />"; 
    mail($ToEmail, $EmailSubject, $MESSAGE_BODY, $mailheader) or die ("Failure"); 

?>

【问题讨论】:

  • 只需添加$_POST["email"]验证,如果内容是电子邮件格式,将无法再注入

标签: php spam-prevention email-headers header-injection


【解决方案1】:

只需将验证电子邮件字段如下所示:

$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);

if ($email === FALSE) {
    echo 'Invalid email';
    exit(1);
}

它会验证您的电子邮件格式,该格式不允许任何类型的注入标头。

【讨论】:

  • 感谢您的回答@Ashish Tiwari!因此,只需将此代码随机复制/粘贴到某处,就可以防止其他人注入标头并将我的表单用于垃圾邮件?还是我必须把它放在特定的地方工作?
  • @Naguah 它只会阻止从电子邮件中注入标头。如果有人试图从 $_POST['email'] 注入任何东西,它不会允许。以上代码仅适用于 $_POST['email']。
  • 可能是愚蠢的问题@Ashish Tiwari,但我已经在联系表单&lt;input type="email" id="email" name="email" /&gt; 的HTML 中设置了限制。他们怎么能操纵这个呢?你的 php 和我的 html 一样吗?
  • 在 html 中,您的 'type="email"' 也会进行验证,但只能从前端进行。但是,如果我使用检查元素或 firebug 通过浏览器打破此验证,它将允许我注入恶意标头或其他内容。因此,我建议您也将服务器端电子邮件验证。有时您的 URL 可以直接从任何脚本(从 PHP 中的 curl)、Bot 或任何脚本调用,那么您的 HTML 验证将不起作用。在这种情况下,PHP 将阻止注入任何内容,而不是格式良好的电子邮件。
  • 非常感谢您的回复@Ashish Tiwari!所以通过在mail($ToEmail, $EmailSubject, $MESSAGE_BODY, $mailheader) or die ("Failure"); 之后粘贴你的代码我应该是安全的?
猜你喜欢
  • 2021-08-15
  • 2013-11-06
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多