Jak uniemożliwić robotom automatyczne wypełnianie formularza?

105

Próbuję wymyślić wystarczająco dobry mechanizm antyspamowy, aby zapobiec automatycznemu generowaniu danych wejściowych. Czytałem, że techniki takie jak captcha, 1 + 1 =? rzeczy działają dobrze, ale stanowią również dodatkowy krok utrudniający bezpłatne szybkie korzystanie z aplikacji (nie szukam czegoś takiego, proszę).

Próbowałem ustawić kilka ukrytych pól we wszystkich moich formularzach, display: none; ale jestem pewien, że można skonfigurować skrypt, aby śledzić ten identyfikator pola formularza i po prostu go nie wypełniać.

Czy wdrażasz / znasz dobrą metodę zapobiegania automatycznemu wypełnianiu formularzy przez roboty? Czy jest coś, co można zrobić bezproblemowo za pomocą przetwarzania HTML ORAZ / LUB po stronie serwera i być (prawie) kuloodporne? (bez JS, bo można by go po prostu wyłączyć).

Staram się nie polegać na sesjach w tym celu (tj. Liczeniu, ile razy przycisk został kliknięty, aby zapobiec przeciążeniom).

Gal
źródło
5
Dzięki, że nie chcesz rozwiązań captcha! IMO, spam z formularzy jest problemem dla właścicieli witryn i zapobieganie temu nie jest ciężarem, który użytkownik powinien ponosić. Istnieje zdecydowanie zbyt wiele alternatywnych sposobów radzenia sobie ze spamem na końcu witryny, o czym świadczą poniższe odpowiedzi. Metody wymagające interakcji użytkownika powinny być używane tylko przez leniwych lub nowicjuszy.
Mike

Odpowiedzi:

73

Łatwym do wdrożenia, ale nie niezawodnym (zwłaszcza w przypadku „określonych” ataków) sposobem rozwiązania problemu antyspamowego jest śledzenie czasu między przesłaniem formularza a załadowaniem strony.

Boty żądają strony, analizują ją i wysyłają formularz. To jest szybkie.

Ludzie wpisują adres URL, ładują stronę, czekają, aż strona zostanie w pełni załadowana, przewiń w dół, przeczytaj treść, zdecyduj, czy skomentują / wypełnią formularz, potrzebują czasu na wypełnienie formularza i prześlij.

Różnica w czasie może być subtelna; i jak śledzić ten czas bez plików cookie, wymaga jakiegoś sposobu bazy danych po stronie serwera. Może to mieć wpływ na wydajność.
Musisz także dostosować czas progowy.

Pindatjuh
źródło
9
Uważaj, jeśli chcesz pozwolić użytkownikom końcowym na używanie automatycznych wypełniaczy formularzy, takich jak addons.mozilla.org/en-US/firefox/addon/1882, które mogą pozwolić na bardzo szybkie przesyłanie. Oprócz captcha, każda rzecz irytująca użytkownika końcowego nie jest ogólnie dobra, a zwłaszcza gdy uniemożliwia osobie w pośpiechu poruszanie się (bardzo) szybko.
płatek śniegu
1
Słuszna uwaga, ale wszystko zależy od kontekstu. Jeśli formularz jest formularzem logowania, całkowicie się z Tobą zgadzam. Ale po co wyłączać logowanie z botów? Jeśli kontekstem jest pole komentarza, takie jak to na StackOverflow, wiem na pewno: jeśli używasz automatycznego wypełniania w polu komentarza, jesteś spamerem. Pamiętaj, że jeśli używasz automatycznego wypełniania podpisów, nadal potrzebujesz czasu, aby wpisać treść.
Pindatjuh
5
Zauważ, że SO robi coś takiego. Edytuj komentarz zbyt szybko lub zbyt wiele razy z rzędu, a zostanie wyświetlony komunikat „Czy jesteś człowiekiem?” strona.
Jakob Borg
2
Hakerzy nie zawsze zażądają formularza. Czasami starannie spreparowany adres URL (za pomocą GET lub POST) wystarczy do wielokrotnego opublikowania formularza przy niewielkim wysiłku.
crafter
1
Zaimplementuj to za pomocą captcha. Jeśli formularz został przesłany zbyt szybko, przedstaw captcha, aby umożliwić prawdziwym użytkownikom przejście.
Yashovardhan99
75

Właściwie uważam, że proste pole Honey Pot działa dobrze. Większość botów wypełnia wszystkie pola formularza, które widzą, mając nadzieję na obejście wymaganych walidatorów pól.

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

Jeśli utworzysz pole tekstowe, ukryjesz je w javascript, a następnie zweryfikujesz, że wartość jest pusta na serwerze, to wyeliminuje 99% robotów i nie powoduje żadnej frustracji u 99% użytkowników . Pozostały 1% osób, które mają wyłączoną obsługę JavaScript, nadal będzie widzieć pole tekstowe, ale w takich przypadkach możesz dodać wiadomość typu „Zostaw to pole puste” (jeśli w ogóle Ci na nich zależy).

(Zauważ też, że jeśli na polu wpiszesz style = "display: none", robot będzie o wiele za łatwo to zobaczyć i odrzucić pole, dlatego wolę podejście javascript).

Ben Scheirman
źródło
1
Czy myślisz, że boty faktycznie przeglądają plik css i sądzą, że jest on wyświetlany: none; ? Naprawdę wolę nie używać rozwiązania opartego na JS, ponieważ można je łatwo wyłączyć.
Gal
1
Wydaje się, że jest to stare rozwiązanie dla webmasterów, zawierające mnóstwo nieistotnych słów kluczowych w celu zwiększenia ich rankingów internetowych. Myślę, że roboty wyszukiwarek, takie jak Google, mogą sobie wyobrazić, że są wyświetlane: brak. Dlaczego inne roboty nie miałyby tego robić?
płatek śniegu
2
Użyłem tej techniki teraz w dwóch witrynach, które były wbijane, a rejestracje botów są teraz zerowe na obu. Nie pomoże to w przypadku ataków ukierunkowanych, ale większość z nich szuka po prostu exploitów lub spamowania.
nirvdrum
25
Mała uwaga: aby obejść problem JS, po prostu użyj CSS, aby umieścić swoje wejście honeypot nad górną częścią strony - w ten sposób będzie w porządku wyłączenie js, a aby obejść ten problem, bot będzie musiał być w stanie przeanalizować CSS bezwzględne pozycjonowanie i podejmij rozsądną decyzję, czy to miód, czy nie. trochę bardziej kuloodporny w ten sposób :)
totalNotLizards
3
@ alexy13 tak, to jest prostsze, ale jak wspomniano w odpowiedzi, botowi dużo łatwiej jest dowiedzieć się, co próbujesz zrobić, po prostu przetestuj jedną właściwość CSS. Jeśli jednak używasz strategii pozycjonowania absolutnego, bot musi przeanalizować wszystkie twoje reguły pozycjonowania i reguły większości rodziców elementu, aby móc dowiedzieć się, czy dane wejściowe byłyby widoczne, czy nie, a następnie dowiedzieć się, czy lub nie działać na podstawie tych informacji - co jest o wiele bardziej kłopotliwe niż dla większości (jeśli nie wszystkich) botów.
totalNotLizards
22

A co jeśli - bot w ogóle nie znajdzie form?

3 przykłady:

  1. Wstaw swój formularz za pomocą AJAX
  • Jeśli nie masz nic przeciwko użytkownikom, którzy mają wyłączony JS i nie są w stanie wyświetlić / przesłać formularza, możesz ich powiadomić i poprosić o włączenie Javascript za pomocą instrukcji noscript:
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
  </p>
</noscript>
  • Utwórz form.htmli umieść formwewnątrz <div id="formContainer">elementu.

  • Wewnątrz strony, na której musisz wywołać ten formularz, użyj pustego <div id="dynamicForm"></div>i tego jQuery:$("#dynamicForm").load("form.html #formContainer");

  1. Zbuduj swój formularz w całości za pomocą JS

// THE FORM
var $form = $("<form/>", {
  appendTo : $("#formContainer"),
  class    : "myForm",
  submit   : AJAXSubmitForm
});

// EMAIL INPUT
$("<input/>",{
  name        : "Email", // Needed for serialization
  placeholder : "Your Email",
  appendTo    : $form,
  on          : {        // Yes, the jQuery's on() Method 
    input : function() {
      console.log( this.value );
    }
  }
});

// MESSAGE TEXTAREA
$("<textarea/>",{
  name        : "Message", // Needed for serialization
  placeholder : "Your message",
  appendTo    : $form
});

// SUBMIT BUTTON
$("<input/>",{
  type        : "submit",
  value       : "Send",
  name        : "submit",
  appendTo    : $form
});

function AJAXSubmitForm(event) {
  event.preventDefault(); // Prevent Default Form Submission
  // do AJAX instead:
  var serializedData = $(this).serialize();
  alert( serializedData );
  $.ajax({
    url: '/mail.php',
    type: "POST",
    data: serializedData,
    success: function (data) {
      // log the data sent back from PHP
      console.log( data );
    }
  });
}
.myForm input,
.myForm textarea{
  font: 14px/1 sans-serif;
  box-sizing: border-box;
  display:block;
  width:100%;
  padding: 8px;
  margin-bottom:12px;
}
.myForm textarea{
  resize: vertical;
  min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>

  1. Wejście na przynętę na boty
  • Boty lubią ( naprawdę lubią) figlarne elementy wejściowe, takie jak:
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`[email protected]`
  • Po użyciu powyższego HTML możesz również użyć CSS, aby nie wyświetlać danych wejściowych:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • Teraz, gdy twoje dane wejściowe nie są widoczne dla użytkownika, spodziewaj się w PHP, że twoje $_POST["email"] powinno być puste (bez żadnej wartości)! W przeciwnym razie nie przesyłaj formularza.
  • Ostatecznie, wszystko co musisz zrobić, to stworzyć innego wejścia jak <input name="sender" type="text" placeholder="Your email"> po (!) W „bot przynętę” wejścia do rzeczywistego adresu e-mail użytkownika.

Podziękowanie:

Developer.Mozilla - Wyłączanie autouzupełniania formularzy
StackOverflow - Ignoruj ​​Tabindex

Roko C. Buljan
źródło
7
Czy przeglądarka prawdziwego użytkownika może potencjalnie zobaczyć pole wprowadzania przynęty jako pole adresu e-mail i automatycznie wypełnić je, gdy użytkownik zdecyduje się automatycznie wypełnić pozostałą część formularza? Użytkownik nie zobaczy, że pole daleko poza ekranem zostało wypełnione i nadal będzie wyglądać jak bot.
wilbbe01
Podejrzewam, autocomplete=nopeże domyślnie on;-) MDN: wejście # attr-autocomplete
obsłużenie
@handle to nie ma znaczenia, to wejście przynęty na boty. Możesz autocomplete="oh sunny day"o tym pisać .
Roko C. Buljan
19

To, co zrobiłem, to użycie ukrytego pola i umieszczenie na nim znacznika czasu, a następnie porównanie go ze znacznikiem czasu na serwerze za pomocą PHP.

Jeśli było to szybsze niż 15 sekund (zależy od tego, jak duże lub małe są twoje formularze), to był to bot.

Mam nadzieję, że to pomoże

adnhack
źródło
1
Dobry pomysł, jednak ustawiłbym limit na około 3 do 5 sekund, aby umożliwić szybkim / zaawansowanym użytkownikom. Używam tego samego podejścia i ustawiając limit dla moich formularzy na 3 sekundy, odfiltrowałem 99% botów.
Kayla,
@adnhack Czy masz na myśli coś takiego: 1) po załadowaniu strony za pomocą php pobierz czas serwera i utwórz sesję. 2) użytkownik lub bot wypełnia formularz, klika Wyślij i $.postwyślij wszystko do zewnętrznego pliku php. 3) w zewnętrznym php ponownie pobierz czas serwera i porównaj z czasem sesji?
Andris,
16

Bardzo skutecznym sposobem wirtualnego wyeliminowania spamu jest utworzenie pola tekstowego zawierającego tekst, na przykład „Usuń ten tekst, aby przesłać formularz!” i ten tekst musi zostać usunięty przed wysłaniem formularza.

Po sprawdzeniu poprawności formularza, jeśli pole tekstowe zawiera tekst oryginalny lub dowolny inny tekst w tej sprawie, nie przesyłaj formularza. Boty mogą czytać nazwy formularzy i automatycznie wypełniać pola Imię i Adres e-mail, ale nie wiedzą, czy muszą faktycznie usunąć tekst z określonego pola, aby przesłać.

Wdrożyłem tę metodę na naszej stronie firmowej i całkowicie wyeliminowałem spam, który otrzymywaliśmy codziennie. To naprawdę działa!

HawleyTronics
źródło
Ciekawe, czy wiesz, czy jest bardziej skuteczny niż inne odpowiedzi ... ukryte pole tekstowe lub śledzenie czasu potrzebnego na wypełnienie formularza?
Austin Henley,
4
To również złapałoby tych użytkowników, którzy nie mogą postępować zgodnie ze wskazówkami, co może nie być pożądane.
wilbbe01
Lubię to! Dopóki bot nie zacznie próbować różnych kombinacji pustych i wypełnionych pól ... najlepszym sposobem na przetestowanie jest zaimplementowanie tego i skanowanie jednym z nich: sectoolmarket.com/…
nmit026
Skuteczna, o ile osoba zarządzająca botem nie dowie się i nie poprawi kodu.
Talha Awan
11

Co powiesz na utworzenie pola tekstowego w tym samym kolorze co tło, które musi pozostać puste. Pozwoli to obejść problem wyświetlania odczytu przez bota: brak

Steve
źródło
2
Dodaj to jako komentarz, jeśli zamiast odpowiedzi otrzymasz więcej reputacji;)
Rob
3
To stwarza problemy z dostępnością. Indeks honeypot nie będzie ukryty przed użytkownikami z czytnikami ekranu.
Otterfan
5
Jestem niewidomym użytkownikiem i raz znalazłem takie pole formularza, a etykieta nad nim brzmiała: „Jeśli to widzisz, pozostaw to pole puste”. Bardzo skuteczna IMO.
Parham Doustdar
8

http://recaptcha.net/

reCAPTCHA to bezpłatna usługa antybotów, która pomaga w digitalizacji książek

Został przejęty przez Google (w 2009 r.):

Zobacz także

Anantha Kumaran
źródło
5
Jako użytkownik uważam, że recaptcha jest często trudny do rozgryzienia. Niektóre słowa są tak trudne do odczytania, że ​​w końcu musisz spróbować 3 lub 4 razy. Chociaż z pewnością pomoże to w rozwiązaniu problemu z robotami.
Brian
Co powiedział Brian i: yro.slashdot.org/story/10/03/02/0135238/ ...
SF.
Znalazłem się na tej stronie, ponieważ CAPTCHA / reCAPTCHA obecnie nie zatrzymuje przesyłania formularzy przez boty. To jest 5 lat później i jest to nowa technika niż wtedy, gdy udzielono tej odpowiedzi
JohnnyFaldo
Jestem zdumiony, dlaczego ta odpowiedź nie ma więcej głosów pozytywnych. czy użytkownik chce, czy nie, jest to świetne rozwiązanie. Zwłaszcza jeśli jest używany tylko do formularza rejestracyjnego.
towi_parallelism
W dzisiejszych czasach recaptcha zaczyna się od prostego pola wyboru, może nie jest tak bolesne, jak kiedyś? ...
rogerdpack
6

Wiele z tych robotów spamujących to po prostu skrypty po stronie serwera, które grasują w sieci. Możesz walczyć z wieloma z nich, używając javascript do manipulowania żądaniem formularza przed jego wysłaniem (tj. Ustawiając dodatkowe pole na podstawie jakiejś zmiennej klienta). Nie jest to pełne rozwiązanie i może prowadzić do wielu problemów (np. Użytkowników bez javascript, na urządzeniach mobilnych itp.), Ale może być częścią planu ataku.

Oto trywialny przykład ...

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

Gdzieś w twoim skrypcie php ...

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

Ponadto captcha są świetne i naprawdę stanowią najlepszą ochronę przed spamem.

John Himmelman
źródło
Dzięki, chociaż javascript można łatwo wyłączyć w dowolnej przeglądarce, unicestwiając w ten sposób mój „mechanizm antyspamowy”, więc szukam czegoś bardziej globalnego.
Gal
Mogę się mylić, ale czy nie powiedziałoby to każdemu użytkownikowi z wyłączonym JS „jesteś złym klientem, odejdź, proszę”?
Gal
Gal, to trywialny przykład, po prostu demonstrujący, jak sprawdzić poprawność względem zmiennej żądania ustawionej przez js po stronie klienta.
John Himmelman,
Captcha @John Himmelman są rozwiązywalne i niekoniecznie stanowią najlepszą ochronę przed spamem. Istnieją usługi płatne, takie jak anti-captcha.com , które rozwiązują captcha za niewielką opłatą.
Problem z tym podejściem polega na tym, że widziałem wiele botów używających PhantomJS. To pozwoliłoby im się przedostać.
Parham Doustdar
4

Dziwię się, że nikt jeszcze nie wspomniał o tej metodzie:

  • Umieść na swojej stronie mały, ukryty obraz.
  • Umieść plik cookie podczas udostępniania tego obrazu.
  • Przetwarzając przesyłanie formularza, sprawdź, czy jest plik cookie.


Plusy:

  • wygodny dla użytkownika i programisty
  • wydaje się być wiarygodne
  • bez JavaScript

Cons:

  • dodaje jedno żądanie HTTP
  • wymaga włączenia obsługi plików cookie na kliencie


Na przykład ta metoda jest używana przez wtyczkę WordPress Pliki cookie do komentarzy .

Gras Double
źródło
Czy boty, które używają rzeczy takich jak PhantomJS, nie mogłyby łatwo obejść tego?
Parham Doustdar
1
Ponieważ jest to pełny silnik przeglądarki, który ładuje zasoby i tak dalej, to powinno być możliwe. Mimo to nie jestem pewien, czy jest często używany przez bota spamującego, ponieważ prawdopodobnie jest znacznie wolniejszy niż skrypty cURL.
Gras Double
z jakiegokolwiek powodu byłoby to lepsze niż token CSRF?
xenoterracide
1
token CSRF w ogóle nie zatrzyma bota. 1. żądanie, POBIERZ formularz, który zawiera token. 2-gie żądanie, POST formularz wraz z tokenem.
Gras Double
4

Wraz z pojawieniem się przeglądarek bezgłowych (takich jak phantomjs), które mogą naśladować wszystko, nie można przypuszczać, że:

  • boty spamowe nie używają javascript,
  • możesz śledzić zdarzenia myszy, aby wykryć bota,
  • nie zobaczą, że pole jest wizualnie ukryte,
  • nie będą czekać przez określony czas przed przesłaniem.

Jeśli to kiedyś było prawdą, to już nie jest.

Jeśli nie chcesz mieć rozwiązania przyjaznego dla użytkownika, po prostu daj im piękny przycisk przesyłania „Jestem spamerem” :

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

Oczywiście możesz bawić się dwoma input[type=image]przyciskami obrazów , zmieniając kolejność po każdym załadowaniu, alternatywne teksty, zawartość obrazów (i ich rozmiar) lub nameprzyciski; co będzie wymagało trochę pracy serwera.

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

Ze względu na dostępność musisz podać poprawną alternatywę tekstową, ale myślę, że długie zdanie jest lepsze dla użytkowników czytników ekranu niż bycie uważanym za bota.

Dodatkowa uwaga: te przykłady pokazują, że zrozumienie angielskiego (lub dowolnego innego) i dokonanie prostego wyboru jest trudniejsze dla spambota niż: czekanie 10 sekund, obsługa CSS lub JavaScript, wiedza, że ​​pole jest ukryte, emulowanie ruchu myszy lub emulowanie pisania na klawiaturze, ...

Adam
źródło
Wydaje mi się, że sam fakt, że musisz wstawić tekst zastępczy, oznacza, że ​​rozwiązanie z dwoma obrazami jest tak samo podatne na skrypty, jak inne alternatywy. A jeśli chodzi o przycisk „Nie jestem spamerem”: czy to też nie może być napisane przez skrypt?
Hawkeye
@Hawkeye Moja odpowiedź była taka, że ​​przeglądarka bezgłowa może emulować wszystko : javascript, opóźnienia, ruchy myszy, ukryte pola ... Termin „piękny” przed moimi przykładami był w pewnym sensie „sarkastyczny”. Ale te przykłady pokazują, że zrozumienie angielskiego i dokonanie prostego wyboru jest trudniejsze dla spambota niż: czekanie 10 sekund, obsługa CSS lub javascript, świadomość, że pole jest ukryte, emulowanie ruchu myszy lub emulowanie pisania na klawiaturze, ...
Adam
Teraz rozumiem twój punkt widzenia. Może dodaj do swojej odpowiedzi ostatnie stwierdzenie „Ale te przykłady ilustrują…” itd. Ponieważ pomogło mi to zrozumieć, co masz na myśli. Na początku wydawało się to sprzecznym argumentem, że „nie możemy zakładać, że boty nie mogą ...”, ale potem wymień rzeczy, których nadal nie możemy założyć, że boty nie potrafią. Ale sedno twojego wniosku polega na tym, że twój przykład (konieczność wyboru przycisku przesyłania) jest trudniejszy - co (teraz, gdy rozumiem) jest genialną odpowiedzią. +1
Hawkeye
3

Bardzo prostym sposobem jest podanie niektórych pól, takich jak <textarea style="display:none;" name="input"></textarea>i odrzucenie wszystkich odpowiedzi, które to wypełniały.

Innym podejściem jest wygenerowanie całego formularza (lub tylko nazw pól) przy użyciu JavaScript; kilka botów może go uruchomić.

Zresztą niewiele zrobisz przeciwko żyjącym „botom” z Tajwanu czy Indii, które zarabiają na życie w ten sposób 0,03 dolara za jeden opublikowany link.

SF.
źródło
2
Wiem, że ta odpowiedź ma prawie 7 lat, ale czuję, że warto to skomentować. Wiele botów można zaprogramować tak, aby ignorowały pola ze stylem = "display: none", aby uniknąć tego typu ochrony.
Kenny Johnson,
Istnieją dziesiątki metod zaciemniania danych wejściowych, używania JavaScript, wyświetlania fikcyjnych elementów na wierzchu, przenoszenia ich z widocznego obszaru, stylizowania ich tak, aby idealnie komponowały się z tłem lub dekoracjami układu itp. Losowanie (haszowanie) nazw wejść (i zachowanie odwzorowania of hashed => original po stronie serwera sesji) pomoże uniknąć używania nazw jako wskazówek i ręcznego mapowania, które dane wejściowe są prawidłowe. Niezależnie od tego nie ma ochrony przed spamem ręcznym.
SF.
2

Mam proste podejście do zatrzymywania spamerów, które jest w 100% skuteczne, przynajmniej z mojego doświadczenia, i unika stosowania reCAPTCHA i podobnych podejść. Kiedy wdrożyłem to podejście, z prawie 100 spamów dziennie na formularzach html moich witryn spadłem do zera w ciągu ostatnich 5 lat.

Działa wykorzystując możliwości e-mailowe ALIAS większości skryptów obsługujących formularze html (ja korzystam z FormMail.pl), wraz z graficznym „kodem” zgłoszenia, który można łatwo utworzyć w najprostszych programach graficznych. Jedna z takich grafik zawiera kod M19P17nH i podpowiedź „Proszę wpisać kod z lewej strony”.

W tym konkretnym przykładzie użyto losowej sekwencji liter i cyfr, ale staram się używać innych niż angielska wersji słów znanych moim gościom (np. „Pnofrtay”). Zwróć uwagę, że monit o pole formularza jest wbudowany w grafikę, a nie pojawia się w formularzu. Zatem dla robota to pole formularza nie daje żadnej wskazówki co do jego przeznaczenia.

Jedyną prawdziwą sztuczką jest upewnienie się, że html twojego formularza przypisuje ten kod do zmiennej „adresat”. Następnie w programie pocztowym upewnij się, że każdy taki kod, którego używasz, jest ustawiony jako alias e-mail, który wskazuje na dowolne adresy e-mail, których chcesz używać. Ponieważ w formularzu nie ma żadnego znaku zachęty do odczytania przez robota ani adresów e-mail, nie ma pojęcia, co wpisać w puste pole formularza. Jeśli nie umieści nic w polu formularza lub cokolwiek poza akceptowalnymi kodami, przesłanie formularza kończy się niepowodzeniem z błędem „zły odbiorca”. Możesz użyć innej grafiki na różnych formach, chociaż z mojego doświadczenia nie jest to konieczne.

Oczywiście człowiek może rozwiązać ten problem w mgnieniu oka, bez wszystkich problemów związanych z reCAPTCHA i podobnymi, bardziej eleganckimi schematami. Jeśli ludzki spamer zareaguje na błąd odbiorcy i zaprogramuje kod obrazu w robocie, możesz go łatwo zmienić, gdy zdasz sobie sprawę, że robot został zaprogramowany, aby zareagować. W ciągu pięciu lat korzystania z tego podejścia nigdy nie otrzymałem spamu z żadnego z formularzy, w których go używam, ani nigdy nie otrzymałem skargi od żadnego ludzkiego użytkownika formularzy. Jestem pewien, że można to przebić dzięki możliwościom OCR w robocie, ale nigdy nie zdarzyło mi się to na żadnej z moich witryn, które używają formularzy html. Użyłem również „pułapek spamowych” (ukrytego kodu HTML „come here”, który wskazuje na moje zasady antyspamowe) z dobrym skutkiem, ale były one skuteczne tylko w około 90%.

user2643367
źródło
1

Myślę tutaj o wielu rzeczach:

  1. używając JS (chociaż tego nie chcesz) do śledzenia ruchu myszy, naciśnięcia klawisza, kliknięcia myszą
  2. uzyskanie adresu odsyłającego (w tym przypadku powinien to być adres z tej samej domeny) ... zwykły użytkownik musi przejść przez witrynę, zanim dotrze do formularza kontaktowego: PHP: Jak uzyskać adres URL odsyłacza?
  3. używając zmiennej $ _SESSION, aby uzyskać adres IP i porównać przesłany formularz z listą adresów IP
  4. Wypełnij jedno pole tekstowe jakimś fikcyjnym tekstem, który możesz sprawdzić po stronie serwera, jeśli został nadpisany
  5. Sprawdź wersję przeglądarki: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... Oczywiste jest, że bot nie używa przeglądarki, a jedynie skrypt .
  6. Użyj AJAX, aby wysłać pola jeden po drugim i sprawdzić różnicę czasu między zgłoszeniami
  7. Użyj fałszywej strony przed / po formularzu, aby wysłać kolejny wpis
valicu2000
źródło
Czy mógłbyś rozwinąć niektóre z tych kroków valicu2000? Czy nadal obowiązują w 2020 roku? Dzięki.
Michael Moriarty
0

Inną opcją zamiast losowych liter i cyfr, jak to robi wiele witryn internetowych, jest zrobienie losowych zdjęć rozpoznawalnych obiektów. Następnie poproś użytkownika o wpisanie koloru przedmiotu na obrazku lub samego obiektu.

Podsumowując, każde rozwiązanie będzie miało swoje wady i zalety. Będziesz musiał znaleźć szczęśliwą medianę między zbyt trudnym dla użytkowników mechanizmem antyspamowym a liczbą robotów spamujących, które mogą się przedostać.

Brian
źródło
Dobry pomysł. Nie użyłbym koloru jako kryterium, ponieważ może to wykluczyć użytkowników dla daltonistów
Neil Aitken
Tak, słuszna uwaga. W rzeczywistości problem z obrazami w ogóle polega na tym, że są one niedostępne, a dzięki uczynieniu ich „dostępnymi” za pomocą tagów alt, roboty mogą je łatwo znaleźć.
Brian
Obrazy to zawsze zły pomysł ... tekst ledwo można przeczytać, napotkałem ten problem na innych stronach internetowych
valicu2000
To tylko captcha z bardzo małym akcentem, który utrudnia użytkownikom. Nie jest też w ogóle dostępny.
Mihai P.
0

Roboty nie mogą wykonywać JavaScript, więc robisz coś takiego, jak wstrzyknięcie jakiegoś ukrytego elementu do strony za pomocą JavaScript, a następnie wykrycie jego obecności przed przesłaniem formularza, ale uważaj, ponieważ niektórzy z twoich użytkowników będą również mieli wyłączony JavaScript

W przeciwnym razie myślę, że będziesz zmuszony skorzystać z formularza klienta potwierdzającego „człowieczeństwo”

Nick Allen
źródło
4
Inteligentne roboty mogą wykonywać javascript. Robiąc rozwiązanie javascript, blokujesz jednak 99% robotów
Ben Scheirman
Jeśli bot jest wtyczką do przeglądarki, będzie mógł wykonywać javascript i widzieć rzeczy, które widzi użytkownik (nawet jeśli wykonujesz renderowanie flash lub webgl)
CoffeDeveloper
Po prostu użyj CSS, aby umieścić pole tekstowe nad stroną, jeśli martwisz się, że ludzie mają wyłączoną obsługę JavaScript.
Chewie The Chorkie
0

Najlepszym rozwiązaniem, jakie znalazłem, aby uniknąć spamowania przez boty, jest użycie bardzo banalnego pytania lub pola w formularzu.

Spróbuj dodać takie pole:

  • Skopiuj „cześć” z pola na bok
  • 1 + 1 =?
  • Skopiuj nazwę witryny internetowej w polu

Te sztuczki wymagają od użytkownika zrozumienia, co należy wprowadzić w formularzu, co znacznie utrudnia bycie celem masowego wypełniania formularzy przez boty.

EDYTOWAĆ

Tyłem tej metody, jak powiedziałeś w swoim pytaniu, jest dodatkowy krok dla użytkownika w celu sprawdzenia poprawności jej formularza. Ale moim zdaniem jest to znacznie prostsze niż captcha, a narzut podczas wypełniania formularza nie przekracza 5 sekund, co wydaje się akceptowalne z punktu widzenia użytkownika.

Thibault Falise
źródło
Jako użytkownik nienawidzę tego gówna. Rozumiem, że spam to problem, ale jak to jest mój problem jako użytkownika witryny? Spam w komentarzach to problem dla właściciela witryny i jako taki użytkownik nie powinien brać na siebie odpowiedzialności za zapobieganie mu. Gdybyś wszedł do sklepu i zostałeś poproszony o założenie butów ochronnych na buty, ponieważ nie chcieli wycierać, co byś pomyślał? Zajmuje to tylko kilka sekund, ale nie jest to twój ciężar.
Mike
Spam @Miki sprawia, że ​​właściciel witryny traci czas. Czas to pieniądz, to co sprzedam będzie dla Ciebie droższe. Twój argument może być łatwo użyty do stwierdzenia, że ​​"Nie obchodzi mnie, że musisz płacić czynsz, ja chcę zapłacić koszt produkcji + 1 $. Jak płacisz czynsz mój problem". Kupując coś płacisz za hosting, transport, czas itp.
Mihai P.
@Mike - To twój problem, ponieważ chcesz, aby formularz działał (oczywiście, ponieważ go używasz). Maszyny znajdują nawet najbardziej niejasne witryny i będą spamować dziesiątki tysięcy zgłoszeń dziennie, przez co te formularze będą bezużyteczne. Więc następnym razem, gdy wyślesz pytanie do małej firmy za pomocą formularza na jej stronie internetowej i musisz dodać 9 + 3, aby to zrobić ... i zadać sobie pytanie „dlaczego muszę to robić?” Twoja odpowiedź może brzmieć „ponieważ naprawdę chcę odpowiedzi na moje pytanie”.
Jimbo Jonny
@JimboJonny Całkowicie przegapiłeś mój punkt widzenia. Spam to problem (jak już wspomniałem), ale istnieją sposoby jego rozwiązania na zapleczu, które nie wpływają negatywnie na wrażenia użytkownika. Obecnie mam formularze kontaktowe rozmieszczone na dziesiątkach (nawet setkach) witryn internetowych, a spam jest minimalny (kilka wiadomości spamowych miesięcznie na formularz), ponieważ zajmowałem się spamem programowo, a nie zmuszając użytkowników do przeskakiwania przez przeszkody. Nie chodziło mi o to, że spam nie jest problemem; to jest problem. Chodziło mi o to, że istnieją sposoby na rozwiązanie tego problemu bez fatygowania się z doświadczeniem użytkownika.
Mike
@JimboJonny Przykładowo, spójrz na najwyżej ocenione (i zaakceptowane) odpowiedzi na to pytanie. Żadne nie obejmują żadnego rodzaju danych wejściowych użytkownika. Tak właśnie powinno wyglądać ograniczanie spamu.
Mike
0

W witrynie JQuery znajduje się poradnik na ten temat. Chociaż jest to JQuery, pomysł jest niezależny od frameworka.

Jeśli JavaScript nie jest dostępny, być może trzeba będzie wrócić do podejścia typu CAPTCHA.

Basen
źródło
0

Najłatwiejszym sposobem, w jaki to zrobiłem, jest umieszczenie pola z wartością i poproszenie użytkownika o usunięcie tekstu z tego pola. ponieważ boty tylko je zapełniają. jeśli pole nie jest puste, oznacza to, że użytkownik nie jest człowiekiem i nie zostanie wysłane. to ten sam cel co kod captcha.

Mateusz
źródło
0

To tylko pomysł, użyłem go w mojej aplikacji i działa dobrze

możesz utworzyć plik cookie przy ruchu myszy za pomocą javascript lub jquery i po stronie serwera sprawdzić, czy plik cookie istnieje, ponieważ tylko ludzie mają mysz, plik cookie może być utworzony tylko przez nich plik cookie może być znacznikiem czasu lub tokenem, który można zweryfikować

h0mayun
źródło
Ciekawy pomysł! Czy w ogóle używałeś tego w prawdziwym świecie?
skybondsor
To nie zadziała. Obecnie spamerzy używają oprogramowania działającego w przeglądarce. Dzięki temu mogą naśladować wrażenia użytkownika, które tworzą plik cookie, a następnie uruchamiać je wielokrotnie, używając różnych treści generowanych przez oprogramowanie.
Norbert Norbertson
To nie zadziała, gdyby użytkownik nie używał myszy. Jeśli Twój formularz jest poprawnie skonfigurowany, użytkownik powinien mieć możliwość wypełnienia całego formularza za pomocą klawiatury. Możesz przechodzić tabulatorami do następnych pól, używać spacji, aby wybierać przyciski opcji i używać spacji (lub klawisza Enter), gdy przechodzisz tabulator do przycisku przesyłania.
Kenny Johnson,
0

Użyj 1) formularza z tokenami 2) Sprawdź formularz, aby utworzyć opóźnienie z adresem IP 3) Zablokuj IP (opcjonalnie)

Vivian
źródło
0

Z mojego doświadczenia wynika, że ​​jeśli formularz jest tylko formularzem „kontaktowym”, nie potrzebujesz specjalnych środków. Spam jest porządnie filtrowany przez usługi poczty internetowej (możesz śledzić żądania formularzy internetowych za pomocą skryptów serwera, aby zobaczyć, co skutecznie dociera do Twojej poczty e-mail, oczywiście zakładam, że masz dobrą usługę poczty internetowej: D)

Przy okazji staram się nie polegać na sesjach w tym celu (na przykład licząc, ile razy przycisk został kliknięty, aby zapobiec przeciążeniom).

Nie sądzę, żeby to było dobre. Rzeczywiście to, co chcę osiągnąć to otrzymywanie e-maili od użytkowników, którzy wykonują określoną czynność, ponieważ są to użytkownicy, którymi jestem zainteresowany (na przykład użytkownicy, którzy przeglądali stronę "CV" i korzystali z odpowiedniego kontaktu Formularz). Więc jeśli użytkownik robi coś, co chcę, zaczynam śledzić jego sesję i ustawiam plik cookie (zawsze ustawiam plik cookie sesji, ale kiedy nie rozpoczynam sesji, jest to tylko fałszywy plik cookie, który ma uwierzyć, że użytkownik ma sesję). Jeśli użytkownik zrobi coś niepożądanego, nie kłopoczę się utrzymywaniem dla niego sesji, więc nie przeciążam itp.

Byłoby również dla mnie miłe, gdyby usługi reklamowe oferowały jakiś rodzaj interfejsu API (być może już istniejącego), aby sprawdzić, czy użytkownik „spojrzał na reklamę”, jest prawdopodobne, że użytkownicy oglądający reklamy są prawdziwymi użytkownikami, ale jeśli tak nie jest naprawdę dobrze, przynajmniej i tak masz 1 wyświetlenie, więc nic straconego. (zaufaj mi, sterowanie reklamami jest bardziej wyrafinowane niż wszystko, co możesz zrobić samodzielnie)

CoffeDeveloper
źródło
0

Właściwie pułapka z wyświetlaczem: żadna nie działa jak urok. Pomaga przenieść deklarację CSS do pliku zawierającego dowolne globalne arkusze stylów, co zmusiłoby roboty spamujące do ich załadowania (bezpośrednia deklaracja stylu = "display: none;" mogłaby zostać zinterpretowana przez bota spamującego, podobnie jak deklaracja stylu lokalnego w samym dokumencie).

To w połączeniu z innymi środkami zaradczymi powinno sprawić, że jakiekolwiek roboty spamujące będą mogły wyładować swoje śmieci (mam księgę gości zabezpieczoną różnymi środkami i jak dotąd dali się złapać w moje główne pułapki - jednak jeśli jakiś bot je ominie, tam czy inni są gotowi do uruchomienia).

To, czego używam, to kombinacja fałszywych pól formularzy (opisanych również jako nieprawidłowe pola w przypadku, gdy używana jest przeglądarka, która nie obsługuje CSS w ogóle lub nie wyświetla: żadnych w szczególności), kontroli poprawności (tj. Jest formatem danych wejściowych prawidłowe?), znaczniki czasu (zarówno zbyt szybkie, jak i zbyt wolne zgłoszenia), MySQL (do implementacji czarnych list opartych na adresach e-mail i IP oraz filtrach powodziowych), listy DNSBL (np. SBL + XBL ze Spamhaus), analiza tekstu ( np. słowa, które silnie wskazują na spam) i e-maile weryfikacyjne (w celu ustalenia, czy podany adres e-mail jest prawidłowy).

Jedna uwaga na temat maili weryfikacyjnych: Ten krok jest całkowicie opcjonalny, ale gdy zdecydujesz się go wdrożyć, proces ten musi być jak najłatwiejszy w użyciu (to znaczy powinien sprowadzać się do kliknięcia linku zawartego w wiadomości e-mail ) i spowodować umieszczenie danego adresu e-mail na białej liście na określony czas, aby uniknąć późniejszej weryfikacji w przypadku, gdy użytkownik chce dodać dodatkowe posty.

Robidu
źródło
0
  1. Używam metody, w której jest ukryte pole tekstowe. Ponieważ boty analizują witrynę, prawdopodobnie ją zapełniają. Następnie sprawdzam, czy jest pusty, jeśli nie jest to strona wraca.

  2. Dodaj weryfikację e-mail. Użytkownik otrzymuje wiadomość e-mail i musi kliknąć łącze. W przeciwnym razie po pewnym czasie odrzuć post.

ciastko
źródło
0

Dodałem kontrolę czasu do moich formularzy. Formularze nie zostaną przesłane, jeśli zostaną wypełnione w mniej niż 3 sekundy, a to działało świetnie, szczególnie w przypadku długich formularzy. Oto funkcja sprawdzania formularza, którą wywołuję po kliknięciu przycisku przesyłania

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}
Harika Y
źródło
0

Przy coraz bardziej wyrafinowanych robotach spamujących i technikach, takich jak zautomatyzowane przeglądarki, trudniej będzie określić źródło spamu. Jednak spam wysyłany przez oprogramowanie, człowieka lub jedno i drugie jest spamem ze względu na zawartość. Myślę, że najlepszym rozwiązaniem jest przepuszczanie publikowanych treści przez antyspamowe API, takie jak Cleantalk czy Akismet. Jest stosunkowo tani i skuteczny oraz nie przeszkadza użytkownikowi. Możesz sprawdzić czas przesyłania formularzy i inne tradycyjne kontrole pod kątem mniej wyrafinowanych botów, zanim przejdziesz do interfejsu API.

nmit026
źródło
Z ciekawości, co sądzisz o reCAPTCHA? Jako pierwszy wymieniasz inne płatne usługi, ale jak wypadają one w porównaniu z reCAPTCHA i / lub dlaczego polecasz je PONAD bezpłatnej usługi?
Hawkeye
0

Możesz spróbować oszukać spam-roboty, dodając atrybut prawidłowego działania po sprawdzeniu poprawności Javascript. Jeśli robot zablokuje JavaScript, nigdy nie będzie mógł poprawnie przesłać formularza.

HTML

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

JAVASCRIPT

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

Następnie dodaję „callback” po .attr (), aby zapobiec błędom.

Santi Nunez
źródło
-1

Tylko moje pięć centów. Jeśli celem tego jest zatrzymanie 99% robotów, co brzmi całkiem nieźle, i jeśli 99% robotów nie może uruchomić skryptu Java, najlepszym rozwiązaniem, które pokonuje wszystko, jest po prostu nieużywanie formularza, który ma akcję przesyłania adres URL posta.

Jeśli formularz jest sterowany za pomocą skryptu java, a skrypt java zbiera dane formularza, a następnie wysyła je za pośrednictwem żądania HTTP, żaden robot nie może przesłać formularza. Ponieważ przycisk przesyłania używałby skryptu Java do uruchomienia kodu, który wysyła formularz.

MartinWebb
źródło