1

私は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);
4

3 に答える 3

1

メッセージ本文で空の文字列を探すだけでなく、すべての空白文字を削除する必要があります (次のようなものを使用して、そこでtrim()コンテンツを探します。

現状では、誰かが空白文字を入力するだけで、PHP の検証に合格することができます。

最後に、javascript の検証はユーザーにとって有用な速度向上にすぎないことを覚えておいてください。JavaScriptをオフにしてサイトを使用することしかできないため、広告の検証は信頼できません。

于 2012-01-23T22:37:14.427 に答える
1

検証では、次のようなことをしたいかもしれません:

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

検証は順調に見えますが、必須フィールドすべてに 1 つのスペースを入れると、空白の提出が通過する可能性があるようです。それが起こっているかどうかはわかりませんが、そこから見ると、空の値はサーバー側の検証に合格しないように見えます。

フォームに入力する可能性のあるボットはすべて JavaScript を無視するため、サーバーの検証が厳密であることを確認してください。

于 2012-01-23T22:37:46.987 に答える
1

(ファイル名から判断すると) 誰かが JavaScript を無効にすると、メール スクリプトに直接投稿し、サーバー側の検証が行われないようです。

これを変更する必要があります:

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

に:

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

または、検証スクリプトが呼び出されたものは何でも。

于 2012-01-23T22:37:50.897 に答える