Вопрос проверки формы контакта - PullRequest
0 голосов
/ 14 ноября 2011

Я сделал контактную форму 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);
?>

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Любая проверка на стороне клиента (Javascript) может быть легко обойдена, например, путем проверки вашей страницы с помощью FireBug.

Валидация используется на стороне клиента только для UX (пользовательского опыта), чтобы сделать жизнь пользователя проще и быстрее. Так что с точки зрения реальной проверки / безопасности нам нужно сделать это снова на стороне сервера (PHP).

Кроме того, этот текущий код PHP открыт для 'E-mail Injection' . Вы можете проверить этот вопрос, чтобы сделать его безопасным Escape-строка для использования в mail () .

В материалах проверки / безопасности электронной почты лучше положиться на уже хорошо написанный / хорошо протестированный модуль, такой как Pear Mail ИЛИ Zend_Mail .

1 голос
/ 14 ноября 2011

На странице почтовой программы 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 .

Хотя приведенный выше код хорошо мне помогал в течение нескольких лет, необходимо отметить, что этот фрагмент не является последним и полным доказательством, так как я не использовал никакой фильтрации / очистки (например, что делают WordPress или другие CMS) для всех пользовательских вводов .Но, тем не менее, это должно помочь вам начать работу с Google при работе с пользовательским вводом.

Вы также можете проверить некоторые из приведенных ниже ссылок для фильтрации / очистки: -

Надеюсь, это поможет.

...