2012-01-23 13 views
1

私はPHPのハックです。私がどこに間違っていたかを理解する助けになるので、Insightは非常に感謝しています。AjaxのコンタクトフォームでPHPの検証に失敗する

基本的に私はthis contact formを自分の目的に適合させました。 Javascriptの検証がうまくいきます! phpのバリデーションも正しく機能しているようです。それは自分のフォームから空白の投稿を始めてしまうまでのことでした。私はこのフォームにcaptchaを追加することを避けようとしています。空白の提出物は迷惑で、自分の適応で間違いをしていると誰かが指摘できれば、私はそれを愛するでしょう。あなたの時間をありがとう。

フォーム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-\.][email protected]([\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._%-][email protected][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'); 
} 

}

Mailscript

$mailTo = '[email protected]'; 
$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); 
+0

いつ/あなたはあなたのPHP検証スクリプトを呼び出していますか? – jeroen

+0

Apacheログには何が表示されますか? (「eregi」を使用しないという提案以外。 – cwallenpoole

+0

@jeroenまあ...それは確かに問題の一部を説明するだろう。今更新しています。 –

答えて

1

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

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

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

したり、検証スクリプトが呼ばれているもの:

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

に。

+0

それは確かにPHPの検証がうまくいかない理由を説明するでしょう。この間違いを指摘していただきありがとうございます。 –

+0

@Justin Lascelleようこそ。 – jeroen

1

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

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

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

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

検証が音に見えますが、彼らはあなたに必要なすべてのフィールドのための1つのスペースを入れた場合、空白の提出が通過得ることができるようにそれはそう:

+0

はい、それは私の答えの大部分が言及しているものです。クライアント側の検証が何をしているのかは問題ではありません。なぜなら、何も表示されないということは、空白の投稿が通過しているからです。クライアント側とサーバー側の妥当性検査の違いは重要なので、その違いについて最後のビットを追加したのはなぜですか。 – cdeszaq

+0

この機能を私に知らせてくれてありがとう。それは問題を助けるように思われる。 –

1

では、あなたがこのような何かをしたい場合があり、確認してください。私はそれが起こっているのかどうかはわかりませんが、そこから見ると、空の値がサーバー側の検証に合格しないように見えます。

あなたのフォームに記入する可能性のあるボットは、JavaScriptを無視するので、サーバーの検証が厳しいかどうかを確認してください。

+0

これは本当に便利な情報です。私の問題の第2部分と戦うように思われるので、trim()について私に言ってくれてありがとう。 –

関連する問題