【问题标题】:Contact form validation issue联系表格验证问题
【发布时间】:2023-03-05 19:36:01
【问题描述】:

我为客户制作了一个 PHP 联系表,他们回复我说他们收到了这样的空白电子邮件:

From: 
E-Mail: 
Message: 

我已经设置了 JavaScript 验证,当我以标准方式提交表单时,它成功拒绝了空白表单。

  • 会发生什么?我们在谈论恶意或愚蠢的事情吗?
  • 我应该进行哪些额外检查? PHP 检查是标准的东西吗?

代码如下。在此先感谢:)

JS 验证:

  $("form#submit").submit(function() {   
    var custname = $('#custname').attr('value');  
    var custemail = $('#custemail').attr('value');  
    var custmessage = $('#custmessage').attr('value');

    if (custname==null || custname=="" || custemail==null || custemail=="" || custmessage==null || custmessage=="") {
      alert("Please fill out the whole form");
      return false;
  }

PHP 邮件页面:

<?php
$to = "name@email.com";
$subject = "Message from website";
$name_field = htmlspecialchars(trim($_POST['custname']));
$email_field = htmlspecialchars(trim($_POST['custemail']));
$message = htmlspecialchars(trim($_POST['custmessage']));

$body = "From: $name_field\n E-Mail: $email_field\n Message: $message";

mail($to, $subject, $body);
?>

【问题讨论】:

  • 也许人们只是禁用了 JavaScript。如果空格无效,则需要在服务器上进行检查。您总是需要检查服务器上的一切
  • 另请注意,您没有在验证码中修剪空格!
  • 另请注意,您可能有一个非常可爱的大脑:-)
  • HTML 怎么样 - 仅仅因为元素的 ID 与作为 $_POST 数组键的 ID 匹配并不意味着它们的 name 属性相同。您的表单元素的name 属性需要与$_POST 数组的键匹配。
  • 所有的消息都是空的,还是只有几个?

标签: php javascript forms validation


【解决方案1】:

在客户端 (Javascript) 上发生的任何验证都可以轻松绕过,例如使用 FireBug 检查您的页面。

验证仅用于客户端的 UX(用户体验),以使用户的生活更轻松、更快捷。因此,就真正的验证/安全性而言,我们需要在服务器端 (PHP) 再次执行此操作。

此外,此当前 PHP 代码已向'E-mail Injection' 开放。您可以检查此问题以使其安全Escape string to use in mail()

在验证/安全电子邮件方面,最好依赖已经编写好的/经过良好测试的模块,例如 Pear MailZend_Mail

【讨论】:

    【解决方案2】:

    在 PHP 邮件页面中,您可以编写如下内容:-

    <?php
    // Site Name ( not Site Title )
    $dotcom = "Custom Site Name";
    
    $main_mail_arr            = array();
    $main_mail_arr['admin']   = 'name@email.com';
    $main_mail_arr['noReply'] = 'no-reply@email.com';
    $main_mail_arr['cc']      = 'cc@email.com';
    $main_mail_arr['bcc']     = 'bcc@email.com';
    
    /**
     * Mail Function
     */
    function genMailing($to, $subj, $body, $from = '', $fromName = '', $reply = true, $cc = '', $bcc = '') {
        global $main_mail_arr, $dotcom;
    
        if( empty( $from ) )
            $from = $main_mail_arr['noReply'];
    
        if( empty( $fromName ) )
            $fromName = $dotcom;
    
        $headers = "MIME-Version: 1.0\r\n";
        $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
        $headers .= "From: $fromName <" . $from . ">\r\n";
    
        if( $reply )
            $headers .= "Reply-to: $fromName <" . $from . ">\r\n";
    
        if( !empty( $cc ) )
            $headers .= "Cc: " . $cc . "\r\n";
    
        if( !empty( $bcc ) )
            $headers .= "Bcc: " . $bcc . "\r\n";
    
        $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
    
        $return_str = mail( $to, $subj, $body, $headers );
        return $return_str;
    }
    
    /**
     * Email Validation Function
     */
    function checkEmail( $email, $type = true ) {
        if(preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i", $email)) {
            $validResult = true;
        }
    
        if($validResult && $type) {
            $e = explode("@", $email);
    
            if(@checkdnsrr($e[1])) {
                $validResult = true;
            }
            else {
                $validResult = false;
            }
        }
    
        return $validResult;
    }
    
    if (isset( $_POST['custname'] ) && isset( $_POST['custemail'] ) && isset( $_POST['contact_msg'] )) {
        $nameError = '';
        $emailError = '';
        $msgError = '';
    
        $valName = trim( $_POST['custname'] );
        $valEmail = trim( $_POST['custemail'] );
        $valMsg = trim( $_POST['custmessage'] );
    
        if( empty( $valName ) ) {
            $nameError = 'Please provide your Name.';
        }
    
        if( !empty($valEmail) && !checkEmail($valEmail, false) ) {
            $emailError = 'Please provide your valid Email Address.';
        }
    
        if( empty( $valMsg ) ) {
            $msgError = 'Please provide your Message / Query / Comments.';
        }
    
        if( empty( $nameError ) && empty( $emailError ) && empty( $msgError ) ) {
            $to = $main_mail_arr['admin'];
            $subject = "Message from website";
    
            $body = '<h2 style="padding-bottom:0px; margin-bottom:0px;">New Details</h2>'.'<hr /><br />'."\r\n\n";
            $body .= '<b>Name</b>: '.stripslashes($valName).'<br />'."\n";
            $body .= '<b>Email Address</b>: '.stripslashes($valEmail).'<br />'."\n";
            $body .= '<b>Message</b>: '.stripslashes($valMsg).'<br />'."\n";
    
            $result = genMailing($to, $subject, $body, $valEmail, $valName, true);
    
            if ($result) {
                // Message for successful mail sent
            }
        }
        else {
            // Show the form below, with the error messages stored in the error variables
        }
    }
    ?>
    

    上面的代码主要涵盖了服务器端验证以及电子邮件验证。但是,您也可以提供比我使用的更严格的电子邮件验证检查,以及Captcha 检查。

    虽然,上面的代码已经为我服务了好几年,必须指出的是,这个 sn-p 不是最后一个完整的证明,因为我没有使用任何过滤器/消毒(比如WordPress 或其他 CMS 可以)用于所有用户输入。但是,在处理用户输入时,它应该能让您很好地开始使用 Google。

    您还可以查看以下链接进行过滤/清理:-

    希望对你有帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多