Сбой проверки PHP в контактной форме Ajax - PullRequest
1 голос
/ 24 января 2012

Я взломщик PHP.Мы очень ценим понимание, так как оно поможет мне понять, где я ошибся.

В основном я адаптировал эту контактную форму для своих собственных целей.Проверка Javascript прекрасно работает!Казалось, что проверка php тоже работает правильно.Так продолжалось до тех пор, пока я не начал получать бланки из собственной формы.Я пытаюсь избежать добавления капчи в эту форму.Пустые представления раздражают, и я был бы рад, если бы кто-то мог указать, если я делаю ошибку в своей адаптации.Спасибо за ваше время.

Форма HTML

<?php include('/ajax/verify.php');?>
            <form action="/ajax/" method="post" id="sendEmail">

                <h4>Contact Us</h4>
                <p class="alert">* All fields are required</p>
                <ol class="forms">
                    <li><label for="username">Your Name</label><input type="text" name="username" id="username" value="" /></li>
                    <li><label for="emailFrom">Your Email</label><input type="text" name="emailFrom" id="emailFrom" value="" /></li>
                    <li><label for="phonenumber">Phone Number</label><input type="text" name="phonenumber" id="phonenumber" value="" /></li>
                    <li><label for="message">Message</label><textarea name="message" id="message"></textarea></li>
                    <li class="buttons"><button type="submit" id="submit">Send Email &raquo;</button><input type="hidden" name="submitted" id="submitted" value="true" /></li>
                </ol>
            </form>

Проверка Javascript

//Ajax Form
$(document).ready(function(){
    $("#submit").click(function(){                                     
        $(".error").hide();
        var hasError = false;
        var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
        var phoneReg = /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/;

        //from email
        var emailFromVal = $("#emailFrom").val();
        if(emailFromVal == '') {
            $("#emailFrom").after('<span class="error">You forgot to enter the email address to send from.</span>');
            hasError = true;
        } else if(!emailReg.test(emailFromVal)) {   
            $("#emailFrom").after('<span class="error">Enter a valid email address to send from.</span>');
            hasError = true;
        }
        //name
        var usernameVal = $("#username").val();
        if(usernameVal == '') {
            $("#username").after('<span class="error">You forgot to enter your name.</span>');
            hasError = true;
        }
        //phone
        var phonenumberVal = $("#phonenumber").val();
        if(phonenumberVal == '') {
            $("#phonenumber").after('<span class="error">You forgot to enter your phone number.</span>');
            hasError = true;
        } else if(!phoneReg.test(phonenumberVal)) { 
            $("#phonenumber").after('<span class="error">Enter a valid phone number.</span>');
            hasError = true;
        }

        //message
        var messageVal = $("#message").val();
        if(messageVal == '') {
            $("#message").after('<span class="error">You forgot to enter the message.</span>');
            hasError = true;
        }


        if(hasError == false) {
            $(this).hide();
            $("#sendEmail li.buttons").append('<img src="/ajax/img/ajax-loader.gif" alt="Loading" id="loading" />');

            $.post("/ajax/sendEmail.php",
                { emailFrom: emailFromVal, username: usernameVal, phonenumber: phonenumberVal, message: messageVal },
                    function(data){
                        $("#sendEmail").slideUp("normal", function() {                 

                            $("#sendEmail").before('<h4 class="success">Thank You</h4><p class="success">One of our highly trained staff will contact with you shortly.</p>');                                          
                        });
                    }
                 );
        }

        return false;
    });                        
});

Проверка скрипта (php)

if(isset($_POST['submitted'])) {    
if($_POST['emailFrom'] == '') {
    $emailFromError = 'You forgot to enter the email address to send from.';
} else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", $_POST['emailFrom'])) {
    $emailFromError = 'Enter a valid email address to send from.';
}
if($_POST['phonenumber'] == '') {
    $emailFromError = 'You forgot to enter the email address to send from.';
} else if (!eregi("/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/$", $_POST['phonenumber'])) {
    $emailFromError = 'Enter a valid email address to send from.';
}
if($_POST['message'] == '') {
    $messageError = 'You forgot to enter the message.';
}
if($_POST['username'] == '') {
    $messageError = 'You forgot your name.';
}

if(!isset($emailFromError) && !isset($messageError)) {
    include('sendEmail.php');
    include('thanks.php');
}

}

Почтовый индекс

$mailTo = 'redacted@emailaddress.com';
$mailFrom = $_POST['emailFrom'];
$username = $_POST['username'];
$phonenumber = $_POST['phonenumber'];
$subject = "New website inquiry from $username";
$message = $_POST['message'];
$message = wordwrap($message, 70);
$messagebody = "From: $username  Phone Number: $phonenumber $message"; 

mail($mailTo, $subject, $messagebody, "From: ".$mailFrom);

Ответы [ 3 ]

1 голос
/ 24 января 2012

В проверке, вы можете сделать что-то вроде этого:

foreach($_POST as $name => $value) {
    $_POST[$name] = trim($value);
}

Проверка выглядит звучащей, но кажется, что пустая отправка может пройти, если они оставят один пробел для всех ваших обязательных полей. Я не уверен, что так происходит, но из того, что я вижу, похоже, что пустые значения не должны проходить проверку на стороне сервера.

Любые боты, которые могут заполнить вашу форму, будут игнорировать javascript, поэтому убедитесь, что проверка на сервере жесткая.

1 голос
/ 24 января 2012

Похоже (судя по именам файлов), что если кто-то отключает javascript, он или она публикует напрямую в почтовый скрипт, и проверка на стороне сервера не выполняется.

Вам необходимо изменить это:

<form action="/ajax/sendEmail.php" method="post" id="sendEmail">

до:

<form action="/ajax/validation.php" method="post" id="sendEmail">

или как называется ваш скрипт проверки.

1 голос
/ 24 января 2012

Вместо того, чтобы просто искать пустую строку в теле сообщения, вам нужно удалить все пробельные символы (используя что-то вроде trim() и , затем ищите содержимое там .

В нынешнем виде кто-то может просто ввести несколько пробельных символов, и он пройдет проверку PHP.

И наконец, помните, что проверка javascript - это всего лишь полезное повышение скорости для пользователя. объявление не заслуживает доверия для проверки, поскольку я мог бы просто использовать ваш сайт с отключенным javascript.

...