Проверка формы и Honeypot - мой код правильный? - PullRequest
0 голосов
/ 29 декабря 2011

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

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

Это 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>

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Возможно, вы используете только проверку данных формы на стороне клиента, что плохо.

Боты не запускают JavaScript, поэтому они игнорируют вашу verify функцию и просто отправляют форму в том виде, как она написана в чистом HTML.

В целом, вы всегда должны уделять проверке на стороне сервера более высокий приоритет по соображениям безопасности и потому, что пользователь мог отключить JavaScript в настройках своего браузера.

Выполнение такого рода проверок в JavaScript должно быть дополнительной функцией для большей простоты использования, но оно никогда не должно реализовывать функцию безопасности (например, ваш "honeypot").

0 голосов
/ 29 декабря 2011

Помещение пробелов в поля (кроме электронной почты) приведет к, по-видимому, пустому результату формы

...