0

我想知道以下代码是否会阻止我的 HTML 电子邮件表单中的电子邮件标头注入?

(我从另一个网站引用了这段代码。)

我的代码如下。

$SpamErrorMessage = "Whoa, slooooooow doooown";
if (preg_match("/http/i", "$first")) {echo "$SpamErrorMessage"; exit();}
if (preg_match("/http/i", "$last")) {echo "$SpamErrorMessage"; exit();}
if (preg_match("/http/i", "$email")) {echo "$SpamErrorMessage"; exit();}
if (preg_match("/http/i", "$message")) {echo "$SpamErrorMessage"; exit();}


/* Email Variables */
$emailSubject = 'You have received an inquiry from your website';
$webMaster = 'info@3elementsreview.com';

/* Data Variables */
$first = Trim(stripslashes($_POST['First']));
$last = Trim(stripslashes($_POST['Last']));
$email = Trim(stripslashes($_POST['E-Mail']));
$message = Trim(stripslashes($_POST['Message']));

$body = <<<EOD
<span style="color:#454545; font-weight:bold; font-size:1.6em;">$first</span><br>

<span style="color:#454545; font-weight:bold; font-size:1.6em;">$last</span><br>

<span style="color:#454545; font-weight:bold; font-size:1.6em;">$email</span><br>
<br>
<span style="color:#252525; font-size:1.4em;">$message</span><br>
EOD;
$headers = "From: $email\r\n";
$headers .= "Content-type: text/html\r\n";
$success = mail($webMaster, $emailSubject, $body,
$headers);
4

2 回答 2

1

简单的答案是:

永远,永远,永远发送冒充他人的电子邮件。

好的,所以他们在您的表格中填写了“发件人”框,也许它是一个有效的电子邮件地址。这并不意味着代表该地址发送电子邮件在技术上或道德上是正确的。如今,几乎可以保证这样做会违反 SPF 或 DKIM 检查,并且您的所有邮件都会被扔进垃圾箱。

应该做的是使用您自己域内的“发件人”地址发送电子邮件。它也应该是一个可以处理任何反弹的真实账户。

或者,如果您仍然想这样做,您可能应该尝试验证您的输入数据是否与预期格式匹配,即“是电子邮件地址”。有很多正则表达式可以做到这一点。

目前,您的代码只是检查输入是否包含字符串“http”,说“足够好”,然后继续发送消息。

于 2013-08-21T23:00:33.243 回答
1

是的,您很容易受到使用提供的代码的攻击。

除了@Sammitch 概述的应该修复“发件人”地址的问题外,我建议扫描任何输入,这些输入将包含在字符串“Content-Type:multipart/”的消息正文或标题中。

可以通过多部分边界将各种数据注入到传出消息中: http ://en.wikipedia.org/wiki/MIME#Multipart_messages

于 2013-08-21T23:09:36.790 回答