【发布时间】:2013-12-25 10:12:45
【问题描述】:
我用 HTML 制作了一个非常简单的电子邮件表单,它应该运行一个 php 脚本来向我的电子邮件地址发送电子邮件:
<form id="emailForm" action="sendMail.php" method="post">
Name:<br>
<input type="text" name="name" value="your name"><br>
E-mail:<br>
<input type="text" name="email" value="your email"><br>
Message:<br>
<textarea cols="40" rows="5" name="message">your message</textarea><br>
<input type="submit" value="Send">
<input type="reset" value="Reset">
</form>
我的 php 脚本如下所示:
<?php
// This function checks for email injection. Specifically, it checks for carriage returns - typically used by spammers to inject a CC list.
function isInjected($str) {
$injections = array('(\n+)',
'(\r+)',
'(\t+)',
'(%0A+)',
'(%0D+)',
'(%08+)',
'(%09+)'
);
$inject = join('|', $injections);
$inject = "/$inject/i";
if(preg_match($inject,$str)) {
return true;
}
else {
return false;
}
}
// Load form field data into variables.
$name = $_REQUEST['name'] ;
$email_address = $_REQUEST['email'] ;
$comments = $_REQUEST['message'] ;
// If the user tries to access this script directly, redirect them to feedback form,
if (!isset($_REQUEST['email'])) {
header( "Location: contact.html" );
}
// If the form fields are empty, redirect to the error page.
elseif (empty($email_address) || empty($comments) || empty($name)) {
header( "Location: error_message.html" );
}
// If email injection is detected, redirect to the error page.
elseif ( isInjected($email_address) ) {
header( "Location: error_message.html" );
}
// If we passed all previous tests, send the email!
else {
mail( "r.krishnan1@umiami.edu", "Message From Your Website!",
$comments, "From: $email_address" );
header( "Location: thank_you.html" );
}
?>
由于我对脚本很陌生,所以这个脚本主要取自示例代码,但对我来说似乎都很有意义。表单所在的html页面和php文件都上传到服务器的同一个目录下。然而,当我按下表单上的“提交”按钮时,我只是在浏览器中被带到 php 文件本身的文本版本(即我只是转到我目录中的 php 文件)并且没有发送电子邮件。为什么会发生这种情况?
【问题讨论】:
-
也许这是一个转储问题,但是您是否为您的项目配置了 Web 服务器?
-
您的联系表单对邮件标头注入开放,垃圾邮件发送者很容易添加额外标头,并且您的
isInjected函数包含不良做法:您应该 white-list 邮件地址,不过滤掉可能被恶意使用的字符。