2011-12-29 5 views
0

私はここまででフォームの検証を成功させてきました。フィールド、電子メールの検証、スパムのハニーポットが必要です。しかし、本当にフォームを提出しないと、私のクライアントの1人が空白のフォーム結果を得ています。だから私は明らかに見ていないでしょう。それは私が思うにはかなり単純なコードです。誰かがすばやく見て、私が何かを逃した場合私に知らせることができますか?フォーム検証とハニーポット - 私のコードは正しいですか?

違う点では、スパムロボットはハニーポットよりスマートになっていますか?

これはJSです:

<script> 
function verify() { 
    var themessage = "You are required to complete the following fields: "; 
    var x=document.form.email.value 
    var atpos=x.indexOf("@"); 
    var dotpos=x.lastIndexOf("."); 

    if (document.form.address.value!="") { 
     themessage = "You are not human! No form for you!"; 
    } 

    if (document.form.first_name.value=="") { 
     themessage = themessage + " - First Name"; 
    } 

    if (document.form.last_name.value=="") { 
     themessage = themessage + " - Last Name"; 
    } 

    if (document.form.email.value=="") { 
     themessage = themessage + " - E-mail"; 
    } 

    if (atpos<1 || dotpos<atpos+2 || dotpos+2>=x.length) { 
     themessage = "You need to enter a valid email address"; 
    } 

    //alert if fields are empty and cancel form submit 
    if (themessage == "You are required to complete the following fields: ") { 
     document.form.submit(); 
    } 

    else { 
     alert(themessage); 
     return false; 
    } 
} 
</script> 

とHTML:

<form name="form" method="post" action="output.php"> 
    <div id="input"> 
     <div id="field">First Name:</div> 
     <input name="first_name" type="text" id="first_name"> 
    </div> 

    <div id="input"> 
     <div id="field">Last Name:</div> 
     <input name="last_name" type="text" id="last_name"> 
    </div> 

    <div id="input"> 
     <div id="field">Email:</div> 
     <input name="email" type="text" id="email"> 
    </div> 

    <div class="input address"><!-- This is the Honeypot --> 
     <div id="field">Address:</div> 
     <input name="address" type="text" id="address"> 
    </div> 

    <div id="input"> 
     <div id="field">Phone:</div> 
     <input name="phone" type="text" id="phone"> 
    </div> 

    <div id="input"> 
     <div id="field3">Comments:</div> 
     <textarea name="comments" id="comments"></textarea> 
    </div> 

    <input type="button" value="Submit" onclick="verify();"> 
</form> 

答えて

0

(離れて電子メールから)フィールドに空白を置くことはあなたがいる一見空のフォーム結果

+0

電子メールフィールドを含むフォームの結果はすべて空白で、コード内に何かが正しくないか、ロボットがよりスマートになり、検証を回避する方法があることがわかります。 私のコードに基づいて、名字と姓が空白の場合、フォームは正しく通過しませんか? – Julesfrog

+0

空白で私はchr(32)を意味しました。しかし、電子メールも空白だった場合、私の疑惑は間違っています。 –

+0

あなたの入力Eugenに感謝します。 – Julesfrog

0

が生成されますおそらく、フォームデータのクライアント側の検証を使用しているだけであり、これは悪いことです。

ボットはJavaScriptを実行しないため、verify機能は無視され、純粋なHTMLで書かれたフォームを送信するだけです。

セキュリティ上の理由から、またユーザーがブラウザの設定でJavaScriptを無効にしている可能性があるため、通常はサーバー側の検証の優先度を高くする必要があります。

JavaScriptでこの種の検証を行うのは、使いやすさのためにオプション機能でなければなりませんが、セキュリティ機能(「ハニーポット」など)を実装するべきではありません。

+0

ありがとうございます。フォームサーバー側を保護する方法に関する情報をどこで見つけることを推奨しますか? – Julesfrog

+0

インターネットに関する情報がたくさんあります。「<あなたの言語>入力の検証」を検索するだけです。 OWASPは、データ検証などの章を持つ[guide](https://www.owasp.org/index.php/OWASP_Guide_Project)を作成しました。 – copy