这是我在使用Jquery和php验证的php联系表单的第二次尝试。我对jquery很满意,但我不确定我是否正确使用了php。我在线查看并结合了一些教程。这是验证字段并确保sendmail功能未正确使用的最佳方法吗?这是一个很好的解决方法吗?还有更好的吗?提前致谢。
if(isset($_POST['submit'])) {
//Check to make sure that the name field is not empty
if(trim($_POST['emailTo']) == '') {
$hasError = true;
} else {
$name = trim($_POST['emailTo']);
}
//Check to make sure that the subject field is not empty
if(trim($_POST['subject']) == '') {
$hasError = true;
} else {
$subject = trim($_POST['subject']);
}
//Check to make sure sure that a valid email address is submitted
if(trim($_POST['emailFrom']) == '') {
$hasError = true;
} else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", trim($_POST['emailFrom']))) {
$hasError = true;
} else {
$email = trim($_POST['emailFrom']);
}
//Check to make sure comments were entered
if(trim($_POST['message']) == '') {
$hasError = true;
} else {
if(function_exists('stripslashes')) {
$comments = stripslashes(trim($_POST['message']));
} else {
$comments = trim($_POST['message']);
}
}
$dodgy_strings = array(
"content-type:"
,"mime-version:"
,"multipart/mixed"
,"bcc:"
);
function is_valid_email($email) {
return preg_match('#^[a-z0-9.!\#$%&\'*+-/=?^_`{|}~]+@([0-9.]+|([^\s]+\.+[a-z]{2,6}))$#si', $email);
}
function contains_bad_str($str_to_test) {
$bad_strings = array(
"content-type:"
,"mime-version:"
,"multipart/mixed"
,"Content-Transfer-Encoding:"
,"bcc:"
,"cc:"
,"to:"
);
foreach($bad_strings as $bad_string) {
if(eregi($bad_string, strtolower($str_to_test))) {
echo "$bad_string found. Suspected injection attempt - mail not being sent.";
exit;
}
}
}
function contains_newlines($str_to_test) {
if(preg_match("/(%0A|%0D|\\n+|\\r+)/i", $str_to_test) != 0) {
echo "newline found in $str_to_test. Suspected injection attempt - mail not being sent.";
exit;
}
}
if($_SERVER['REQUEST_METHOD'] != "POST"){
echo("Unauthorized attempt to access page.");
exit;
}
if (!is_valid_email($email)) {
echo 'Invalid email submitted - mail not being sent.';
exit;
}
contains_bad_str($email);
contains_bad_str($subject);
contains_bad_str(body);
contains_newlines($email);
contains_newlines($subject);
//If there is no error, send the email
if(!isset($hasError)) {
$emailTo = 'My@Email.com';
$body = "Name: $name \n\nEmail: $email \n\nSubject: $subject \n\nComments:\n $comments";
$headers = 'From: My Site <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;
mail($emailTo, $subject, $body, $headers);
$emailSent = true;
}
}
?>
答案 0 :(得分:0)
这非常复杂(你写的脚本)。 基本上你需要两个脚本,一个用于ajax,第二个用于普通的php联系表单。 让我们调用第一个ajax.php(两个脚本都包含sam验证规则),当用户输入例如他的邮件(你将jquery模糊事件绑定到电子邮件)时,请求被发送到...
?ajax.php行动= checkmail&安培; email=example@example.com
然后,您可以通过电子邮件输入框打印返回,例如“您的电子邮件有效”。或者相反。
您也可以只使用ajax.php通过将所有参数传递给它来发送邮件,然后在不刷新页面的情况下显示用户“发送电子邮件”或“电子邮件未发送,因为......”。
答案 1 :(得分:0)
这是一个非常好的解决方案,一个工作的解决方案。我见过很多最糟糕的事 只有几个笔记。
contains_bad_str(body);
没用。整个“坏话”都接近了。换行测试就足够了DO NOT TALK TO STRANGERS
。切勿与可能的攻击者交谈,向他们提供任何反馈。所有这些“可疑的注射尝试”都是幼稚的,更多的是它 - 它为攻击者提供他们可以使用的信息。在所有这些情况下,始终只发送500 HTTP错误。为什么第一个只设置一个变量
if(trim($_POST['emailTo']) == '') {
$hasError = true;
,第二个会输出错误并退出?
if (!is_valid_email($email)) {
echo 'Invalid email submitted - mail not being sent.';
exit;
}
您是否会向公平用户提供有关错误的任何反馈?像“请填写所有必填字段”这样的东西?
我不会向用户提供电子邮件主题,而是提供一些硬编码的句子,例如Feedback from ".$_SERVER['HTTP_HOST']
。我想区分邮箱中的反馈消息和常规消息。 (我也不会做那个花哨的回复功能,但这是我自己的偏好)
stripslashes的东西。为什么只留言?其他字段的行为是否相同?至少你在申请之前检查了get_magic_quotes_gpc()。我将它自动化,在脚本的顶部,条带和修剪,只是在$ _POST数组的循环中。
答案 2 :(得分:0)
我建议来自phpbuilder.com的三年历史错误的文章可能不是用来制作自己的邮件的最佳来源。相反,我会使用更新的东西,如PHP 5 SPL中的验证和清理过滤器。
我还会看看PHPMailer或其他一些将为您执行安全检查的库。