Php联系表格

时间:2010-08-21 04:52:26

标签: php jquery

这是我在使用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;
    }
}
?>

3 个答案:

答案 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或其他一些将为您执行安全检查的库。