Создание контактных форм, устойчивых к спаму [дубликат]

Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.

например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.

public Class myClass
{
   public int prop1 {get;set;}
}

Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref.prop1 = 1;  //This line throws error
     }
}

выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.

Чтобы исправить это, вам нужно создать экземпляр (присвоить объект ссылке на этот класс).

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref = new myClass();
        ref.prop1 = 1;  
     }
}
31
задан BillK 9 February 2010 в 17:04
поделиться

13 ответов

#sec {
  visibility: hidden;
  padding: 0;
  margin: 0;
  height: 1;
}
<form method="POST" action="www.google.com">
  NAME
  <input type='text' name='name' />
  <br /> EMAIL
  <input type='text' name='email' />
  <br /> MESSAGE
  <textarea name='message' /></textarea>
  <br />
  <input type='text' name='security' id='sec' placeholder="Do not enter anything here" />
  <input type='submit' formaction="" />
</form>

** Здесь только пользователь, который нажимает кнопку отправки, может отправить форму. использование автоматической отправки просто перенаправляет бота на google.com. **

* Также ввод «безопасность» является полем ввода, которое скрыто для пользователей и видимым для определенных ботов, обычно известных как HoneyPot Captcha. На стороне сервера вы можете просто пропустить все запросы с заполненным полем «безопасность». Не каждый бот может быть обманут таким образом, и именно здесь вступает в игру атрибут formaction *

0
ответ дан atj4me 31 August 2018 в 18:43
поделиться

Если вы хотите сделать полностью входное решение, у меня был успех недавно, оставив атрибут действия формы пустым и заполнив его с помощью функции $ (document) .ready.

Пример:

Ваш html будет:

<form method="POST" action="" id="contact-form">

] и в любом месте этой страницы вы можете использовать это, чтобы заполнить его.

<script>
        $(document).ready(function(){
                 $("#contact-form").attr("action", "/yourMailScript.cgi");
        });
</script>

Бот-браузер без javascript не получит действие формы, и они получат 404 при представлении. Любой, у кого нормальный браузер (если у них нет JS, отключенного по параноидальным причинам), получит нормальное поведение.

4
ответ дан David Tesch 31 August 2018 в 18:43
поделиться
  • 1
    Я использую подобный метод для замены значения действия. По умолчанию идет к месту типа honeypot. Но я использую событие on-click / on-focus для изменения значения действия. Думаю, для бота это очень сложно имитировать. См. Мой ответ ниже. – Rick Hellewell 13 July 2018 в 00:17

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

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

0
ответ дан devno 31 August 2018 в 18:43
поделиться

Единственный (клиентский) способ, отличный от подтверждения пользователя типа CAPTCHA, - это написать все это динамически. Многие (но не все) роботы, вероятно, игнорируют динамический контент. Например,

document.write("<"+"form>"
  +" NAME "
  +" <"+"input type='text' name='name' /> "
  +"EMAIL "
  +"<"+"input type='text' name='email' /> "
  +"MESSAGE "
  +"<"+"textarea name='message' /> "
  +"<"+"input type='submit' /> "
+"<\/form> ");
6
ответ дан Graza 31 August 2018 в 18:43
поделиться
  • 1
    Это действительно работает? Это похоже на супер простой способ – BillK 9 February 2010 в 17:13
  • 2
    Я очень похожую вещь, когда я просто задавал адрес электронной почты динамически при загрузке страницы. Электронная почта не находится в одной строке, то есть: "my"+"email@"+domain+".com" – Rob Fonseca-Ensor 9 February 2010 в 17:18
  • 3
    Все боты обходят это. – Alysko 9 February 2010 в 17:40
  • 4
    @Alysko: Правда? Я так не думаю. Вы говорите, что все боты полностью понимают и интерпретируют Javascript? Единственная проблема с этим - не все клиенты понимают Javascript либо ... – Tomas 9 February 2010 в 18:43
  • 5
    Некоторые боты обработали бы его, но я предполагаю, что любой, кто пишет бота для скорости, попытается ограничить количество обработки скриптов, поэтому многое пропустит его. @Tomas - согласился с проблемой, хотя не все клиенты ее понимают. Этот подход полностью нарушает изящную деградацию или прогрессивное улучшение. @Rob - Я делаю подобные вещи, но обычно на отдельных строках, а с @ в шестнадцатеричном виде, например m="my";m+="email\x40";m+="dom";m+="ain.c";m+="om"; - параноидальное решение, но я надеюсь, что он обманет всех ботов. Опять же - он разрушает изящную деградацию. Решение Wim выглядит потрясающе – Graza 11 February 2010 в 10:48

Вы можете просто зарегистрировать IP ($ _SERVER ['REMOTE_ADDR']) и запретить повторную валидацию с помощью этого IP-адреса в течение 1 минуты или, более точно, начать сеанс, предоставить идентификатор без вашего посетителя и запретить повторную проверку на 1 минута (или больше, но бот не любит ждать).

-2
ответ дан gromax 31 August 2018 в 18:43
поделиться
  • 1
    Боты обычно не хранят файлы cookie, поэтому сеанс не будет работать. Кроме того, большинство ботов работают на взломанных клиентских ПК, что приводит к бесконечной поставке новых IP-адресов. У меня никогда не было проблем с большим количеством нежелательных сообщений с одного IP-адреса, это всегда накопление с течением времени от множества разных клиентов, что вызывает проблемы ... – Wim 9 February 2010 в 17:16
  • 2
    Вы правы Вим: это просто хорошая практика, чтобы избежать множественного подчинения. – Alysko 9 February 2010 в 17:42

Я нашел хорошую идею на этой странице:

http://www.evengrounds.com/developers/alternatives-to-captcha

Вы можете заставить кнопку SUBMIT отображать страницу подтверждения, на которой вы объясняете пользователю, что он должен нажать кнопку CONFIRM, чтобы отправить сообщение. Спамботы обычно подают только первую форму и пропускают второй шаг.

0
ответ дан Maciek Łoziński 31 August 2018 в 18:43
поделиться

Используйте учетную запись Google или Yahoo. У них хорошие фильтры для защиты от спама.

4
ответ дан Milan Babuškov 31 August 2018 в 18:43
поделиться
  • 1
    Это хорошая идея, gmail поддерживает автоматическую пересылку электронных писем, не так ли? Это может хорошо работать. Вероятно, это и самая простая реализация. И вы рискуете потерять потенциальных клиентов из-за расстройства. – sam 9 February 2010 в 17:11
  • 2
    +1; или любую другую фильтрацию спама в папке «Входящие». Нет причин для того, чтобы обременять пользователя CAPTCHA или браузерами пользователей с помощью html-трюков. Это проблема с входящими сообщениями. – Tomas 9 February 2010 в 18:28
  • 3
    Но если сайт работает под несколькими ботами, есть вероятность, что вы спуститесь с сайта. Это не решение для предотвращения спама, использующего yahoo или gmail. Вы должны решить это с вашего сайта. – Subhojit Mukherjee 17 June 2014 в 07:55

Используйте антиспамовый API, такой как Akismet или Cleantalk. Вы можете использовать традиционные проверки для менее сложных ботов, прежде чем использовать API. Анти-спам-API - единственный способ поймать спам, представленный человеком.

0
ответ дан nmit026 31 August 2018 в 18:43
поделиться

grep для методов URI, символов urlencoded или двух символов разметки HTML, похоже, работает.

0
ответ дан Peter Flynn 31 August 2018 в 18:43
поделиться

Скрытые поля, глупые вопросы (3 + 4?) и т. д. не очень эффективны при блокировании спама на формах, IMHO.

Я исследовал это несколько лет назад и придумал решение, которое я называю «FormSpammerTrap». Он использует код JavaScript для «просмотра» для фокуса / onclick в обязательных полях. Автоматизированные процессы, если они не настроены специально для определенного сайта (который занимает больше времени, чем владельцы spambot хотят взять), не могут «сфокусировать / отключить» нужное поле. (И есть некоторые другие методы, которые я использую.)

У меня есть бесплатное решение на моем сайте www.FormSpammerTrap.com . И там есть форма, где спам-боты могут пытаться спамить ... и они не имеют более трех лет. Вы можете попробовать ... это все с открытым исходным кодом, поэтому вы можете увидеть, как это работает. (И, если вы используете форму, я не собираю вашу электронную почту. Я отвечаю один раз, а затем удаляю вашу электронную почту.)

Моя техника намного эффективнее блокирует спам-боты, ИМХО. Они не смогли создать контактную форму на этом сайте.

** Добавлено 12 июля 2018 года ** Фокус в том, чтобы добавить событие on-click / on-focus, которое изменяет параметр действия на фактическая страница обработки. В противном случае, значение по умолчанию, которое я использую, является сайтом типа honeytrap. Я думаю, что спамеру сложно моделировать эти события, хотя возможно возможно. Эта технология блокирует множество ботов-спамеров.

И все же, через пару лет, используя технику на этом сайте, форма не была распущена ботами. (Я определяю бот-спамера, который отправляет несколько сообщений через атаку, а не только один submit.)

Работает для меня.

0
ответ дан Rick Hellewell 31 August 2018 в 18:43
поделиться

Использовать технологию JS. Например, если пользователь приходит на вашу контактную страницу, тогда javascript будет генерировать строку или что-то подобное, что вы предпочитаете, и помещать информацию в скрытое текстовое поле. Но это не настоящее решение, умный бот может легко взломать его.

Другой способ: вы также можете использовать проверку электронной почты после отправки формы. И сохраните данные в своей базе данных. Если клиент проверяет URL по электронной почте, контактная информация будет отправлена ​​вам по почте из базы данных.

Также используйте задержку, чтобы предотвратить непрерывную атаку робота. Как sleep() в PHP-коде. Это добавит немного задержки в ваш код. Таким образом, вы можете уменьшить случайные атаки, но это не метод предотвращения.

0
ответ дан Subhojit Mukherjee 31 August 2018 в 18:43
поделиться

Вам не нужно будет уменьшать спам, потому что сообщения не публикуются на веб-сайте.

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

-3
ответ дан Tomas 31 August 2018 в 18:43
поделиться
  • 1
    К сожалению, это не так. Текущее поколение спам-ботов просто просматривает веб-страницы и отправляется в формы all , которые они могут найти. Они не знают и не заботятся о том, действительно ли их сообщение делает это на веб-странице или нет ... – Wim 9 February 2010 в 17:19
  • 2
    Я получаю менее 10 спам в день для такой частной контактной формы на большом сайте. Но даже если вы получите сотни, какое это имеет значение? Разве это не то, для чего у нас есть спам-фильтры? Решение на стороне входа, такое как перехват или другие выпущенные решения, является ненужным бременем для частной контактной формы. – Tomas 9 February 2010 в 18:26
  • 3
    Спам-фильтры могут помочь в этом случае, но не всегда. В моей веб-форме Drupal есть слишком много заголовков и нижних колонтитулов, которые делают весь адрес электронной почты в порядке просмотра фильтра, но не посещают относительно небольшое количество содержимого спама посередине. – Wim 10 February 2010 в 00:06

Очень простой трюк, который я использовал с удивительно хорошим успехом, заключается в следующем: Предоставьте текстовое поле, которое скрыто от пользователей с помощью style="display: none", но с заманчивым именем, например email. Большинство ботов будут заполнять что-то в этой области, но люди не могут видеть это так, как обычно. На сервере просто убедитесь, что поле пустое, иначе обработайте его как спам.

55
ответ дан Wim 31 August 2018 в 18:43
поделиться
  • 1
    Отличная идея. Комбинация вашей идеи и Гразы может быть именно такой. – BillK 9 February 2010 в 17:16
  • 2
    Эта великолепная идея! В качестве альтернативы, если боты достаточно умны, чтобы игнорировать такие теги, установите display:none динамически в javascript и добавьте комментарий, в котором пользователь должен НЕ заполнить поле в случае сбоя javascript. – Graza 9 February 2010 в 17:16
  • 3
    Мне нравится эта идея. CAPTCHA - это боль шеи. Защита от спама должна заключаться в обнаружении ботов, а не в том, что пользователь является человеком. – Dónal Boyle 9 February 2010 в 17:19
  • 4
    отличная идея! Но теперь вы отдаете его нам, боты будут знать :) – Alysko 9 February 2010 в 17:39
  • 5
    Я строил бота, как мы говорим, чтобы включить этот дизайн ... злой смех – Anthony Forloney 9 February 2010 в 18:56
Другие вопросы по тегам:

Похожие вопросы: