Предотвращение отправки формы бота - программирование
Подтвердить что ты не робот

Предотвращение отправки формы бота

Я пытаюсь найти хороший способ предотвратить отправку ботов, сохраняя при этом простой процесс. Я прочитал несколько замечательных идей, но я подумал о добавлении опции подтверждения при отправке формы. Пользователь нажимает кнопку "Отправить" и появляется подсказка подтверждения Javascript, требующая взаимодействия с пользователем.

Будет ли это предотвращать ботов или может бот понять это слишком легко? Ниже приведен код и JSFIddle, чтобы продемонстрировать мою идею:

JSFIDDLE

$('button').click(function () {
  if(Confirm()) {
    alert('Form submitted');
    /* perform a $.post() to php */
  }
  else {
    alert('Form not submitted');
  }
});

function Confirm() {
  var _question = confirm('Are you sure about this?');
  var _response = (_question) ? true : false;
  return _response;
}
4b9b3361

Ответ 1

Это одна проблема, с которой столкнулись многие люди. Как указывает pst, бот может просто отправлять информацию непосредственно на сервер, минуя javascript (см. Простые утилиты, такие как cURL и Postman). Многие боты теперь могут использовать и взаимодействовать с javascript. Хари Кришнан указывает на использование капчи, наиболее распространенной и успешной из которых (насколько мне известно) является reCaptcha. Но у капч есть свои проблемы, и он не одобряется сборником всемирной паутины, в основном по причинам неэффективности и недоступности.

И чтобы мы не забыли, злоумышленник всегда может использовать человеческий интеллект, чтобы победить капчу. Есть истории о том, как злоумышленники платили за то, что люди взламывали капчи для рассылки спама, а работники не осознавали, что они участвуют в незаконной деятельности. Amazon предлагает услугу под названием Mechanical Turk, которая занимается такими вещами. Amazon будет категорически возражать, если вы будете использовать их сервис в злонамеренных целях, и у этого есть обратная сторона: стоить денег и создавать бумажный след. Однако есть и другие провайдеры, которые не возражают против подобных возражений.

Так что ты можешь сделать?

Мой любимый механизм - скрытый флажок. Сделайте так, чтобы на нем была надпись "Согласны ли вы с условиями использования наших услуг?" возможно даже со ссылкой на некоторые серьёзные термины. Но вы по умолчанию выключаете его и скрываете через css: поместите его на страницу, поместите в контейнер с нулевой высотой или нулевой шириной, поместите div поверх него с более высоким z-индексом. Сверните здесь свой собственный механизм и будьте креативны

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

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

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

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

Опять же, просто молча отмените запрос, одновременно обслуживая ту же страницу благодарности (или введите задержку ответа на форму спама, если вы хотите быть злопамятным - это может не помешать им перегружать ваш сервер, и это может даже привести к их перегрузке). Вы работаете быстрее, сохраняя больше открытых соединений дольше. В этот момент вам нужно аппаратное решение, брандмауэр с настройкой балансировки нагрузки).

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

Обновление касательно капчи

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

Нетрудно представить, распространяя подобный подход на другие типы капчи. Я выполнил поиск и нашел эти ссылки интересными:

ReCaptcha не работает?
Практичные, не основанные на изображениях капчи
Если мы знаем, что CAPTCHA можно победить, почему мы до сих пор используем их?
Есть ли реальная альтернатива использованию изображений CAPTCHA?
Как трио хакеров поставило Google reCaptcha на колени - очень интересно, потому что речь идет об аудио-капчах.

О, и мы вряд ли были бы полны без обязательного комикса XKCD.

Ответ 2

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

Я сделал следующее:

  • Я установил свойство action формы в mustusejavascript.asp, который просто показывает сообщение, что представление не работает, и что у посетителя должен быть включен javascript.

  • Я устанавливаю свойство onsubmit формы в функцию javascript, которая устанавливает свойство действия формы на реальную страницу получения, например receivemessage.asp

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

Ответ 3

Ваш код не будет препятствовать отправке бота, но это не из-за того, как ваш код. Типичный бот, скорее всего, выполнит внешний/автоматический запрос POST для URL-адреса (action). Типичные боты не представляют HTML, CSS или JavaScript. Они читают HTML и действуют на них, поэтому любая клиентская логика не будет выполнена. Например, CURLing URL-адрес получит разметку без загрузки или оценки какого-либо JavaScript. Можно создать простой script, который ищет <form>, а затем отправит CURL POST на этот URL с соответствующими ключами.

С учетом этого необходимо решение на стороне сервера для предотвращения отправки бота. Captcha + CSRF должно быть достаточно. (http://en.wikipedia.org/wiki/Cross-site_request_forgery)

Ответ 4

Вы можете просто добавить captcha в свою форму. Так как captchas будет different, а также в images, боты не могут decode это. Это одна из наиболее широко используемых систем безопасности для всех wesites...

Ответ 5

Вы можете измерить время регистрации, которое не требуется заполнять вечность в текстовые поля!

Ответ 6

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

Ответ 7

Нет. Вы все еще думаете, что Captcha или ReCap безопасны?

Боты nowDays умны и могут легко распознать буквы на изображениях с помощью инструментов OCR (поиск для понимания)

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

Это все, когда бот или любой зомби представляют форму, которую вы проверяете, если данный хэш равен сеансу, хранящемуся Хэш;)

Подробнее... CSRF!

Ответ 8

Я проверил проверку ввода формы, которая предотвратила регистрацию программного ввода.

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

    ;failed automation attempt because window doesnt register changes.
    ;$iUse = _IEGetObjById($nIE,"InternalUseOnly_id")
    ;_IEAction($iUse,"focus")        
    ;_IEAction($iUse,"click")
    ;_IEFormElementOptionSelect($iUse,1,1,"byIndex")
    ;$iEdit = _IEGetObjById($nIE,"canEdit_id")
    ;_IEAction($iEdit,"focus")
    ;_IEAction($iEdit,"click")
    ;_IEFormElementOptionSelect($iEdit,1,1,"byIndex")
    ;$iTalent = _IEGetObjById($nIE,"TalentReleaseFile_id")
    ;_IEAction($iTalent,"focus")
    ;_IEAction($iTalent,"click")
    ;_IEFormElementOptionSelect($iTalent,2,1,"byIndex")
    ;Sleep(1000)
    ;_IEAction(_IETagNameGetCollection($nIE,"button",1),"click")

Это заставило меня переосмыслить, как вводить ввод, непосредственно манипулируя действиями мыши, чтобы имитировать больше выбора с поведением типа мыши. Излишне говорить, что мне не придется вручную загружать изображения 1 на 1, чтобы обновлять изображения продуктов для компаний. номер окна перед письмами, чтобы мой script в конце каталога, и когда появляется окно загрузки изображения, я должен использовать активную доступность, чтобы получить syslistview из окна и выбрать второй элемент, который является изображением, первым элементом является папка. или первый элемент в файле findfirstfile возвращает только файлы. Я использую имя для поиска элемента в базе данных элементов, а затем получаю доступ к этим элементам и обновляю несколько атрибутов после загрузки изображений, а затем перемещаю файл из этой папки в другую папку, чтобы он не обрабатывался снова и перейдите в следующий первый файл в списке и запустите цикл до тех пор, пока имя script не будет найдено в конце обновления.

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

С уважением.

Ответ 9

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

    function spamChk() {
    var ent1 = document.MyForm.Email.value
    var str1 = ent1.toLowerCase();
    if (str1.includes("noreply")) {
    document.MyForm.reset();
    }

<input type="text" name="Email" oninput="spamChk()">

Я действительно пришел сюда сегодня, чтобы узнать, как перенаправить IP-адреса определенных спам-ботов в АД.. просто для удовольствия

Ответ 10

Отличные идеи

Я удалил re-captcha некоторое время назад, преобразовал мой contactform.html в contactform.asp и добавил его в начало (очевидно, с некоторым промежуточным кодом, чтобы полностью заполнить несколько функций, таких как sendmail, проверить заполненную форму и т.д.).

    <%
     if Request.Form("Text") = 8 then
        dothis
      else
        send them to google.com
     end if
   %>

В форме я вставил базовое текстовое поле с текстом имени, так что оно просто выглядит как что-либо, не указывающее, для чего оно вообще нужно, затем я вставил текст на 2 строки выше красным, в котором указано, что 2 + 6 = в поле ниже, чтобы отправьте ваш запрос.