2011-12-29 4 views
0

Я успешно использовал проверку формы ниже. Он требует полей, проверки электронной почты и honeypot для спама. Тем не менее, один из моих клиентов получает результаты пустой формы, когда действительно форма не должна быть отправлена ​​вообще. Так что, возможно, я не вижу очевидного. Я думаю, это довольно простой код. Может кто-нибудь быстро взглянуть и сообщить мне, если я что-то пропустил?Проверка формы и Honeypot - Является ли мой код правильным?

С другой стороны, спам-роботы становятся умнее, чем приманки?

Это является 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 должно быть необязательной функцией для более удобного использования, но никогда не должно реализовывать функцию безопасности (например, ваш «honeypot»).

+0

Благодарим вас за ввод. Любая рекомендация о том, где найти информацию о том, как защитить серверную форму? – Julesfrog

+0

Существует много информации об этом в Интернете, просто найдите « validate input». OWASP создал [руководство] (https://www.owasp.org/index.php/OWASP_Guide_Project), в котором есть собственная глава по проверке данных и т. Д. – copy