2015-11-04 45 views
0

下面是我用于简单联系表单的代码。看起来我们的代码正在被操纵,有人正在使用联系表单进行电子邮件注入。我对PHP比较陌生,我尝试过在线研究,但目前我没有快乐。PHP电子邮件注入防护

有没有人有一些建议?

<?php 

// get posted data into local variables 
$EmailFrom = Trim(stripslashes($_POST['EmailFrom'])); 
$EmailTo = "[email protected]"; 
$Subject = "subject"; 
//$Title = Trim(stripslashes($_POST['Title'])); 
$First = Trim(stripslashes($_POST['First'])); 
//$Surname = Trim(stripslashes($_POST['Surname'])); 
//$Company = Trim(stripslashes($_POST['Company'])); 
//$Address = Trim(stripslashes($_POST['Address'])); 
//$Address2 = Trim(stripslashes($_POST['Address2'])); 
//$Address3 = Trim(stripslashes($_POST['Address3'])); 
//$Area = Trim(stripslashes($_POST['Area'])); 
//$County = Trim(stripslashes($_POST['County'])); 
//$Postcode = Trim(stripslashes($_POST['Postcode'])); 
$Telephone = Trim(stripslashes($_POST['Telephone'])); 
//$Fax = Trim(stripslashes($_POST['Fax'])); 
$EmailFrom = Trim(stripslashes($_POST['EmailFrom'])); 
$AmountOwed = Trim(stripslashes($_POST['AmountOwed'])); 
$ip = Trim(stripslashes($_POST['ip'])); 
//$Marketing = Trim(stripslashes($_POST['Marketing'])); 
//$Contact = Trim(stripslashes($_POST['Contact'])); 
$Details = Trim(stripslashes($_POST['Details'])); 

// validation 
$validationOK=true; 
if (Trim($EmailFrom)=="Your email: (required)") $validationOK=false; 
if (!$validationOK) { 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=error.php\">"; 
    exit; 
}; 
if (Trim($Telephone)=="Your Telephone: (required)") $validationOK=false; 
if (!$validationOK) { 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=error.php\">"; 
    exit; 
}; 
if (Trim($First)=="Your name: (required)") $validationOK=false; 
if (!$validationOK) { 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=error.php\">"; 
    exit; 
} 

// prepare email body text 
$Body = ""; 
//$Body .= "Title: "; 
//$Body .= $Title; 
//$Body .= "\n"; 
$Body .= "First: "; 
$Body .= $First; 
$Body .= "\n"; 
//$Body .= "Surname: "; 
//$Body .= $Surname; 
//$Body .= "\n"; 
//$Body .= "Company: "; 
//$Body .= $Company; 
//$Body .= "\n"; 
//$Body .= "Address: "; 
//$Body .= $Address; 
//$Body .= "\n"; 
//$Body .= "Address2: "; 
//$Body .= $Address2; 
//$Body .= "\n"; 
//$Body .= "Address3: "; 
//$Body .= $Address3; 
//$Body .= "\n"; 
//$Body .= "Area: "; 
//$Body .= $Area; 
//$Body .= "\n"; 
//$Body .= "County: "; 
//$Body .= $County; 
//$Body .= "\n"; 
//$Body .= "Postcode: "; 
//$Body .= $Postcode; 
//$Body .= "\n"; 
$Body .= "Telephone: "; 
$Body .= $Telephone; 
$Body .= "\n"; 
//$Body .= "Fax: "; 
//$Body .= $Fax; 
//$Body .= "\n"; 
$Body .= "EmailFrom: "; 
$Body .= $EmailFrom; 
$Body .= "\n"; 
$Body .= "AmountOwed: "; 
$Body .= $AmountOwed; 
$Body .= "\n"; 
$Body .= "ip: "; 
$Body .= $ip; 
$Body .= "\n"; 
//$Body .= "Marketing: "; 
//$Body .= $Marketing; 
//$Body .= "\n"; 
//$Body .= "Contact: "; 
//$Body .= $Contact; 
//$Body .= "\n"; 
$Body .= "Details: "; 
$Body .= $Details; 
$Body .= "\n"; 

// send email 
$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>"); 

// redirect to success page 
if ($success){ 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=thankyou.php\">"; 
} 
else{ 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=error.php\">"; 
} 
?> 
+4

“电子邮件注入”是什么意思? – TZHX

+0

我想你可能要做的是检查你的领域是否不是空的。你没有检查这些。 –

+0

您是否可以添加一个您认为是电子邮件注入的输入? –

回答

0

我建议你使用一个(简单吗?)正则表达式验证所有字段你接受来自在线模块。

只是作为一个例子,你可以检查电子邮件地址使用像

if (!preg_match('^\[email protected]\S+\.\S+$/',$EmailFrom)) { # this is bad 

东西,你也可以使用该特定任务这一特定PECL功能符合RFC 822: http://php.net/manual/en/function.mailparse-rfc822-parse-addresses.php

的要避免接受来自攻击者的控制字符(例如换行符),所以定义严格的正则表达式并根据已知模式验证所有输入。

0

PHP的邮件功能非常容易受到攻击。有许多载体要注意的,但最有可能的是一个报头喷射:

$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>"); 

在上面的代码中,检查是否指定了headers字段作为"From: <$EmailFrom>"

如果$EmailFrom包含一个有效的电子邮件地址,没有别的,那么这是非常好的。但是,黑客需要做的就是向它添加行提要,并且他可以开始添加额外的标题。一旦你可以在电子邮件中插入任意标题,你可以基本上重写整个电子邮件。

您目前没有对电子邮件地址进行任何验证,因此黑客可以轻而易举地将任何他喜欢的东西插入到该字段中。

所以简短的回答是要更仔细地验证提交的电子邮件地址实际上是有效的电子邮件地址。但是,正如我已经说过的那样,这不是PHP的mail()函数的唯一问题,所以更长期的,您应该认真考虑用更强大的解决方案替换它,例如phpMailerSwiftMailer库。这些库通过添加强大的安全功能层来解决使用PHP发送邮件的安全问题。它们还使得使用更高级的电子邮件功能(如HTML电子邮件和附件)变得更加容易。

如果您在PHP中遇到安全问题,您应该做的另一件事是确保您使用的是最新版本。如果您的PHP版本低于5.4.45(截至此答案的日期),那么您应该认为它具有已知的安全漏洞,无论您的实际代码有多好。您尚未提及您的版本,但请检查并考虑升级(如有必要)。

最后,我注意到你正在对你的输入数据做trim(stripslashes(...))。请注意,这是完全没用的。较新版本的PHP并不需要你这样做。老版本的PHP有一个设置,可以自动将斜线添加到输入数据;然后在您的代码中使用stripslashes()删除它们。然而这个功能在很多年前已从PHP中删除,所以如果你使用的是最新的PHP版本,stripslashes()函数将无法实现任何功能。但更重要的是,即使在必要的时候,它也没有做任何事情来验证该领域的内容或使其免于受到攻击。