2012-03-01 3 views
3

На моем сайте у меня есть несколько форм, где кто-то (без регистрации) может отправить сообщение указанному, зарегистрированному пользователю. Форма проста, и я хочу сохранить этот путь. Каков наилучший способ защитить контактную форму повторно спама и ботов, если я не хочу использовать какую-либо капчу?Как защитить контактную форму без капчей?

Your message:... 
Your e-mail:... 
[Send] 
+0

Проверяйте правильность проверки на сервере, а также на стороне клиента и выполняйте почтовые функции, не сохраняйте в БД –

+0

Защитите от чего? Если это спам-боты, тогда цель CAPTCHA - рассказать ботам от людей, поэтому все механизмы защиты ботов подпадают под этот термин. –

+0

Связанные: http://stackoverflow.com/questions/2603363/good-form-security-no-captcha –

ответ

7

Так варианты:

  1. Maximize запрос/IP
  2. Добавить секретный вопрос
  3. Captcha (даже если это не нравится)
  4. Отправка электронной почты, чтобы проверить его
  5. Передача данных с использованием JavaScript

Подробная информация об этих и моем мнении о них.

  1. Это хорошо работает, чтобы предотвратить отправку многих сообщений, но несколько копий из них все равно попадут. Если вы считаете, что это доступно, это может сработать. Примечание. Спамер может использовать прокси или динамический IP-адрес, но это может быть медленным. Возможно, подумайте о том, чтобы не блокировать пользователя, но добавляйте капчу, если они отправляют слишком много сообщений электронной почты.
  2. Что это? Это такие вопросы, как «10 + 1» или «десять плюс 1» или «Какой это день?». Они могут работать хорошо - если ваш сайт будет на очень немногих языках. Captchas все еще лучше, но это хорошо работает на случай.
  3. Вам это не нравится, но я все еще говорю, что это лучшее. Добавление одной reCAPTCHA не так сложно, но это предотвратит 90% спамеров - или больше. Но есть две проблемы с этим: 1. Иногда человек тоже не может его прочитать, 2. спамеры могут использовать людей для его решения для минимальной суммы (например, $ 0.001/captcha), и иногда они это делают. Но это также означает случай 2.
  4. Может быть хорошо, но если спамеры заметят это, они могут генерировать случайные адреса электронной почты и проверять их с помощью SMTP. Но они обычно идут к самой легкой цели и уходят.
  5. Хорошо, спамеры не могут заставить ботов действовать как щелчок, но они могут делать коды, которые делают клик необязательным. Но самое простое правило назначения остается.

На мой взгляд, лучшим решением является решение 3, затем решение 2, затем решение 1, затем решение 4 и 5.

+0

Спасибо, это очень полезно. Я думаю, что сосредоточусь на первом в точке 4, а затем на точке 1. – Lucas

0

Вы можете сделать что-то, чтобы доказать, что пользователь является человеком. Если вы хотите сохранить простой, возможно, поле, задающее математический вопрос, например, «2 + 5?». Но это не так безопасно, как может быть уловка. Но, если возможный спам не вредит вам, это нормально.

+1

¿Почему бы и нет? Если вопрос задан в правильном формате, он может быть намного яснее, чем klingonish captcha – Alfabravo

+0

@Alfabravo точно, мне часто трудно читать capthcas (и да, я имею в виду вас, StackOverflow). Изображение с искаженными буквами - sooo 2006. – CodeCaster

+0

Некоторые скрипты могут захватывать текст и решать вопрос, поэтому я указал его. –

1

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

Вам нужно будет сделать это на стороне сервера, проверив и сохранив IP-адреса пользователей. Затем, когда они снова отправят форму, проверьте, действительно ли пользователь уже находится в заблокированных IP-адресах.

Это то, что StackOverflow implemented 2 года назад.

3

Вы можете защитить свою форму с помощью клавиш формы техники:

  1. При отображении формы для пользователя, сгенерировать случайный идентификатор («форма ключа») только для этой единственной формы представления. Сохраните ключ формы в переменной сеанса. Отправьте «ключ формы» в скрытое поле ввода.
  2. На стороне отправки проверьте представленную форму формы напротив той, которая хранится в переменной сеанса. Немедленно аннулировать его после использования. (Удалить его из сеанса)

Без искаженным или что-то сравнимого, что невозможно действительно защитить форму от злоупотреблений.

Однако, используя эту технику, злоумышленник спамер бы

  1. запрос о форме через HTTP для каждого отдельного представления формы, чтобы получить действительный уникальный forkey
  2. разбора DOM дерево/HTML код, чтобы получить форма ключа
  3. представить его в правильном формате

нет автоматической рассылку спама формы контакта гусеничного не делает это, насколько я знаю.

Этот метод также защищает вашу форму от нескольких закрытых представлений.

Вот пример кода:

<?php 
session_start(); 
if (isset($_POST['form_submit'])) { 
    // do stuff 
    if (isset($_POST['formkey']) && isset($_SESSION['formkeys'][$_POST['formkey']])) { 
    echo "valid, doing stuff now ... "; flush(); 
    // delete formkey from session 
    unset($_SESSION['formkeys'][$_POST['formkey']]); 
    // release session early - after committing the session data is read-only 
    session_write_close(); 
    // do whatever you like with the form data here 
    send_contact_mail($_POST); 
    } 
    else { 
    echo "request invalid or timed out."; 
    } 
} 
else { 
    // show form with formkey 
    $formkey = md5("foo".microtime().rand(1,999999)); 
    // put current formkey into list of valid form keys for the user session 
    if (!is_array($_SESSION['formkeys']) { 
    $_SESSION['formkeys'] = array(); 
    ] 
    $_SESSION['formkeys'][$formkey] = now(); 
?> 
<html> 
<head><title>form key</title></head> 
<body> 
    <form method="POST"> 
    <input type="hidden" name="PHPSESSID" value="<?=session_id()?>"> 
    <input type="text" name="formkey" 
     value="<?= $formkey ?>"> 
    <input type="submit" name="form_submit" value="Contact us!"> 
    </form> 
</body> 
</html> 
<?php } ?> 
+0

Спасибо. Это хорошее решение. Но это не сработает, если кто-то откроет более одной контактной формы. Пользователь не должен этого делать, поэтому в основном это хорошее решение. Я попытаюсь сделать что-то подобное на основе вашего кода, спасибо за совет. – Lucas

+0

@ Лукас адаптировал мой код для хранения * списка допустимых ключей формы * в сеансе, чтобы реагировать на ваш прецедент с несколькими формами. Кроме того, этот подход может быть легко усилен для проверки тайм-аута. теперь ключ формы теперь хранится с отметкой времени. Единственное, что вы должны сделать, это вставить проверку, если ключи формы уже вышли из строя. – Kaii

+0

Как вы реализуете решения выше? –

6

На мой взгляд, большинство сайтов (за исключением билетов продавцов и крупные сайты, такие как Google, и т.д.) может предотвратить комментарий/форма спама без капчи, используя ряд различных методы в сочетании. Недавно я создал PHP-проект с открытым исходным кодом, который реализует следующие тесты, чтобы определить, является ли представление вероятным законным или спамом.

  • Скрытые поля формы - Если скрытое поле формы заполняется, это показатель спама
  • Время Форма Подчинение - Если форма заполняется слишком быстро или слишком медленно, это показатель спама
  • слишком много ссылок - Если поле комментария слишком много URL (номер настраивается) это показатель спама
  • Mouse Movement - Если пользователь не использует их мышью, это показатель спама
  • Используется клавиатура - Если пользователь не использует свой keybaord, это показатель спама
  • Validate Referer - Если HTTP-референт не соответствует URL-адресу формы, мы не должны принимать его.
  • Подтвердить электронную почту. Если адрес электронной почты, указанный в форме, недействителен с точки зрения синтаксиса, мы не должны принимать заявку.

Адрес URL проекта. Мне нравится тест Kaii выше, сделает отличный дополнительный тест для phpFormProtect. https://github.com/mccarthy/phpFormProtect

+0

Интересный проект, спасибо за эту идею. – Lucas

Смежные вопросы