Robotların bir formu otomatik olarak doldurmasını nasıl önleyebilirim?


105

Otomatik olarak oluşturulan girdileri önlemek için yeterince iyi bir anti-spam mekanizması bulmaya çalışıyorum. Captcha, 1 + 1 =? Gibi teknikleri okudum. şeyler iyi çalışıyor, ancak uygulamanın ücretsiz hızlı kullanımını engelleyen fazladan bir adım da sunuyorlar (lütfen böyle bir şey aramıyorum).

Tüm formlarımda bazı gizli alanları ayarlamayı denedim, display: none; Bununla birlikte, bir komut dosyasının bu form alanı kimliğini izleyecek ve basitçe doldurmayacak şekilde yapılandırılabileceğinden eminim.

İyi bir anti-otomatik form doldurma robotu yöntemi uyguluyor / biliyor musunuz? HTML VE / VEYA sunucu tarafı işleme ile sorunsuz bir şekilde yapılabilen ve (neredeyse) kurşun geçirmez bir şey var mı? (JS olmadan, biri devre dışı bırakabileceği için).

Bunun için oturumlara güvenmemeye çalışıyorum (yani aşırı yüklenmeleri önlemek için bir düğmeye kaç kez tıklandığını sayıyorum).


5
Captcha çözümlerini istemediğiniz için teşekkürler! IMO, form spam'i site sahipleri için bir sorundur ve bunu önlemek kullanıcının katlanması gereken bir yük değildir. Buradaki yanıtlardan da anlaşılacağı üzere, site sonunda spam'ı ele almanın çok fazla alternatif yolu var. Kullanıcı etkileşimi gerektiren yöntemler yalnızca tembel veya acemi tarafından kullanılmalıdır.
Mike

Yanıtlar:


73

Anti-spam'i çözmenin uygulanması kolay ancak kusursuz olmayan (özellikle "belirli" saldırılarda) bir yolu, form gönderme ve sayfa yükleme arasındaki süreyi izlemektir.

Botlar bir sayfa ister, sayfayı ayrıştırır ve formu gönderir. Bu hızlı.

İnsanlar bir URL yazar, sayfayı yükler, sayfa tam olarak yüklenmeden önce bekler, aşağı kaydırır, içeriği okur, yorum yapıp yapmamaya karar verir / formu doldurur, formu doldurmak için zaman ister ve gönderir.

Zaman farkı ince olabilir; ve bu sürenin çerezler olmadan nasıl izleneceği, bir şekilde sunucu tarafı veritabanı gerektirir. Bu, performansta bir etki olabilir.
Ayrıca eşik süresini ayarlamanız gerekir.


9
Son kullanıcıların çok hızlı gönderime izin verebilecek addons.mozilla.org/en-US/firefox/addon/1882 gibi otomatik form doldurucuları kullanmasına izin vermek isteyip istemediğinize dikkat edin . Captcha'nın yanı sıra, son kullanıcıyı rahatsız eden herhangi bir şey genellikle iyi değildir ve özellikle de bir kişinin (çok) hızlı gitmesini önlerken.
kar tanesi

1
İyi bir nokta, ama hepsi içeriğe bağlı. Form bir giriş formu ise, size tamamen katılıyorum. Ama neden botlardan girişi devre dışı bırakasınız? Bağlam, StackOverflow'daki bunun gibi bir yorum kutusuysa, eminim: Bir yorum kutusuna otomatik doldurma kullanırsanız, o zaman bir spam göndericisiniz. İmzalar için otomatik doldurma kullanırsanız, içeriği gerçekten yazmak için yine de zamana ihtiyacınız olduğunu unutmayın.
Pindatjuh

5
SO'nun böyle bir şey yaptığını unutmayın. Bir yorumu hızlı veya arka arkaya çok fazla düzenlediğinizde "İnsan mısınız?" sayfa.
Jakob Borg

2
Bilgisayar korsanları her zaman formu istemez. Bazen, dikkatlice hazırlanmış bir URL (GET veya POST kullanarak), formu çok az çabayla birden çok kez göndermek için yeterli olacaktır.
crafter

1
Bunu captcha ile uygulayın. Form çok hızlı gönderildiyse, gerçek kullanıcıların geçmesine izin vermek için bir captcha sunun.
Yashovardhan99

75

Aslında basit bir Bal Çömleği tarlasının iyi çalıştığını görüyorum. Çoğu bot , gerekli alan doğrulayıcılarından kurtulmayı umarak gördükleri her form alanını doldurur .

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

Bir metin kutusu oluşturursanız, onu javascript'te gizlerseniz, ardından değerin sunucuda boş olduğunu doğrulayın , bu, oradaki robotların% 99'unu ortadan kaldırır ve kullanıcılarınızın% 99'unda herhangi bir hayal kırıklığına neden olmaz . Javascript'in devre dışı bırakıldığı geri kalan% 1 yine metin kutusunu görecektir, ancak bu tür durumlar için "Bu alanı boş bırakın" gibi bir mesaj ekleyebilirsiniz (bunlarla ilgileniyorsanız).

(Ayrıca, sahada style = "display: none" yaparsanız, bir robotun bunu görmesi ve alanı atması çok kolaydır, bu yüzden javascript yaklaşımını tercih ederim).


1
Botların gerçekten css dosyasından geçtiğini ve görüntülendiğini düşünüyor musunuz: yok; ? Kolayca devre dışı bırakılabildiğinden, JS tabanlı bir çözüm kullanmayı gerçekten tercih etmiyorum.
Gal

1
Web yöneticileri için web sıralamalarını artırmak için tonlarca alakasız anahtar kelime içeren eski bir çözüm gibi görünüyor. Bence arama tarayıcı botları, bu tür google olanlar, görüntülendiğini anlayabilir: yok. Neden diğer botlar bunu yapamaz?
kar tanesi

2
Bu tekniği şimdi dövülen iki sitede kullandım ve bot kayıtları artık her ikisinde de sıfır 0. Hedefli saldırılara karşı yardımcı olmaz, ancak çoğu yine de istismar veya spam göndermeyi arıyor.
nirvdrum

25
Buradaki küçük nokta: JS sorununu aşmak için, bal küpü girişinizi sayfanın üst kısmına yerleştirmek için CSS kullanın - bu şekilde js'nin devre dışı bırakılması uygun olacaktır ve bunun üstesinden gelmek için botun CSS'yi ayrıştırabilmesi gerekecektir. mutlak konumlandırma ve bal küpü olup olmadığına dair sağduyulu bir karar verin. bu şekilde biraz daha kurşun geçirmez :)
totalNotLizards

3
@ alexy13 evet, daha basit ama yanıtta belirtildiği gibi, bir bot için ne yapmaya çalıştığınızı anlaması çok daha kolay, sadece bir CSS özelliğini test edin. Bununla birlikte, mutlak konumlandırma stratejisini kullanırsanız, bot, girdinin görünür olup olmayacağını anlayabilmek için tüm konumlandırma kurallarınızı ve öğenin ebeveynlerinin çoğunun kurallarını ayrıştırmalı ve ardından ya da bu bilgiye göre hareket etmemek - ki bu çoğu (hepsi olmasa da) botlar için değerinden daha fazla sorun.
totalNotLizards

22

Ya - Bot hiç bulamazsa form?

3 örnek:

  1. AJAX kullanarak formunuzu ekleyin
  • JS'yi devre dışı bırakan ve bir formu göremeyen / gönderemeyen kullanıcılarla sorun yaşıyorsanız, onları bilgilendirebilir ve önce bir noscript ifadesi kullanarak Javascript'i etkinleştirmelerini sağlayabilirsiniz:
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
  </p>
</noscript>
  • Bir eleman oluşturun form.htmlve formiçine bir <div id="formContainer">eleman yerleştirin.

  • Bu formu çağırmanız gereken sayfanın içinde bir boş <div id="dynamicForm"></div>ve bu jQuery kullanın:$("#dynamicForm").load("form.html #formContainer");

  1. Formunuzu tamamen JS kullanarak oluşturun

// 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. Bot-yem girişi
  • Botlar şımarık girdi öğelerini sever ( gerçekten sever) :
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`dsaZusil@kddGDHsj.com`
  • Yukarıdaki HTML'yi kullandıktan sonra, girdiyi görüntülememek için CSS'yi de kullanabilirsiniz:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • Artık girdiniz kullanıcı tarafından görülemediğine göre PHP'de sizin $_POST["email"] boş (herhangi bir değer olmadan) olmasını bekleyin ! Aksi takdirde formu göndermeyin.
  • Son olarak, yapmanız gereken tüm oluşturmaktır başka girişi gibi <input name="sender" type="text" placeholder="Your email"> (!) Sonra "bot-yem" gerçek kullanıcı Eposta adresi için girdi.

Teşekkürler:

Developer.Mozilla - Form otomatik tamamlamayı kapatma
StackOverflow - Tabindex'i yoksay


7
Meşru bir kullanıcının tarayıcısı, yem giriş alanını potansiyel olarak bir e-posta alanı olarak görebilir ve kullanıcı formun geri kalanını otomatik olarak doldurmayı seçtiğinde otomatik olarak doldurabilir mi? Kullanıcı, ekranın dışındaki bir alanın doldurulduğunu görmezdi ve yine de bir bot gibi görünürlerdi.
wilbbe01

autocomplete=nopeVarsayılan olarak on;-) MDN olarak değiştirileceğinden şüpheleniyorum : girdi # attr-otomatik tamamlama
işleme alın

@handle önemli değil, bu bir bot yem girdisi. Bunun için yazabilirsiniz autocomplete="oh sunny day".
Roko C. Buljan

19

Yaptığım şey, gizli bir alan kullanmak ve üzerine zaman damgasını koymak ve ardından bunu PHP kullanarak Sunucudaki zaman damgasıyla karşılaştırmaktı.

15 saniyeden daha hızlıysa (formlarınızın ne kadar büyük veya küçük olduğuna bağlı olarak) bu bir bottu.

Umarım bu yardım eder


1
İyi fikir, ancak hızlı / güçlü kullanıcılara izin vermek için sınırı yaklaşık 3 ila 5 saniye olarak ayarlardım. Aynı yaklaşımı kullanıyorum ve formlarım için botların% 99'unu filtreleyen 3 saniyeye bir sınır koyuyorum.
Kayla

@adnhack Aşağıdaki gibi bir şey mi kastediyorsunuz: 1) php ile sayfa yüklemesinde sunucu zamanını alın ve oturum oluşturun. 2) kullanıcı veya bot formu doldurur, Gönder'e tıklar ve $.posttümünü harici php dosyasına gönderir. 3) harici php'de tekrar sunucu zamanını alın ve oturum süresiyle karşılaştırın?
Andris

16

İstenmeyen postayı sanal olarak ortadan kaldırmanın çok etkili bir yolu, içinde "Formu göndermek için bu metni kaldırın!" Gibi metin içeren bir metin alanına sahip olmaktır. formun gönderilebilmesi için bu metnin kaldırılması gerekir.

Form doğrulamasının ardından, metin alanı orijinal metni veya bu konu için rastgele herhangi bir metni içeriyorsa, formu göndermeyin. Botlar, form adlarını okuyabilir ve Ad ve E-posta alanlarını otomatik olarak doldurabilir, ancak göndermek için belirli bir alandaki metni gerçekten kaldırmaları gerekip gerekmediğini bilmezler.

Bu yöntemi kurumsal web sitemizde uyguladım ve günlük olarak aldığımız spam'i tamamen ortadan kaldırdı. Gerçekten çalışıyor!


İlginç, diğer cevaplardan daha etkili olup olmadığını biliyor musunuz ... gizli bir metin kutusu mu yoksa formu doldurmak için gereken süreyi izlemek mi?
Austin Henley

4
Bu, istenmeyebilecek talimatları takip edemeyen kullanıcıları da yakalayacaktır.
wilbbe01

Bunu severim! Bot farklı boş ve doldurulmuş alan kombinasyonlarını denemeye başlayana kadar ... test etmenin en iyi yolu bunu uygulamak ve şunlardan
biriyle taramaktır

Botu yöneten kişi bulamadığı ve kodu değiştirdiği sürece etkilidir.
Talha Awan

11

Boş kalması gereken arka planla aynı renkte bir metin alanı giriş kutusu oluşturmaya ne dersiniz? Bu, bir bot okuma ekranı sorununu çözecektir: yok


2
Lütfen bir cevap yerine daha fazla itibar elde ettiğinizde bunu yorum olarak ekleyin;)
Rob

3
Bu, erişilebilirlik sorunları ortaya çıkarır. Honeypot dizini, ekran okuyucusu olan kullanıcılardan gizlenmeyecektir.
Otterfan

5
Ben kör bir kullanıcıyım ve bir kez buna benzer bir form alanı buldum ve üstündeki etikette "Bunu görüyorsanız, bunu boş bırakın." Çok etkili IMO.
Parham Doustdar

8

http://recaptcha.net/

reCAPTCHA, kitapları dijitalleştirmeye yardımcı olan ücretsiz bir antibot hizmetidir

Google tarafından satın alındı ​​(2009'da):

Ayrıca bakın


5
Bir kullanıcı olarak recaptcha'yı çoğu zaman anlamakta zorlanıyorum. Bazı kelimelerin okunması o kadar zor ki, sonunda 3 veya 4 kez denemek zorunda kalıyorsun. Her ne kadar bu kesinlikle robot sorununa yardımcı olacaktır.
Brian


CAPTCHA / reCAPTCHA şu anda bot formu gönderimini durdurmadığı için kendimi bu sayfada buldum. Bu 5 yıl sonra ve bu cevabın verildiği
zamandan

Bu cevabın neden daha fazla oy alamadığına şaşırdım. kullanıcı beğenip beğenmesin, bu harika bir çözüm. Özellikle sadece kayıt formu için kullanılıyorsa.
towi_parallelism

Bu günlerde recaptcha basit bir onay kutusu olarak başlıyor, belki de eskisi kadar acı verici değil? ...
rogerdpack

6

Bu spam botların çoğu, web'de gezinen sunucu tarafı komut dosyalarıdır. Form isteğini gönderilmeden önce değiştirmek için bazı javascript kullanarak birçoğuyla savaşabilirsiniz (yani, bazı istemci değişkenlerine göre ek bir alan belirleyerek). Bu tam bir çözüm değildir ve birçok soruna yol açabilir (örneğin, javascript kullanmayan kullanıcılar, mobil cihazlarda vb.), Ancak saldırı planınızın bir parçası olabilir.

İşte önemsiz bir örnek ...

<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>

PHP betiğinizde bir yerlerde ...

<?php

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

?>

Ayrıca captcha'lar harikadır ve spam'e karşı gerçekten en iyi savunmadır.


Teşekkürler, ancak javascript herhangi bir tarayıcıda kolayca devre dışı bırakılabilir, bu da "anti spam mekanizmamı" yok eder, bu yüzden daha küresel bir şey arıyorum.
Gal

Yanılıyor olabilirim, ancak bu her JS devre dışı bırakılan kullanıcıya 'kötü bir müşterisin, defol git lütfen' demez mi?
Gal

Gal, bu önemsiz bir örnek, yalnızca istemci tarafı js tarafından ayarlanmış bir istek değişkenine göre nasıl doğrulama yapılacağını gösteriyor.
John Himmelman

@John Himmelman Captcha'lar çözülebilirdir ve spam'a karşı en iyi savunma olmayabilir. Düşük bir ücret karşılığında form captcha'ları çözecek anti-captcha.com gibi ücretli hizmetler var.

Bu yaklaşımla ilgili sorun, PhantomJS kullanan birçok bot görmüş olmamdır. Bu onların geçmesine izin verirdi.
Parham Doustdar

4

Henüz kimsenin bu yöntemden bahsetmemesine şaşırdım:

  • Sayfanıza küçük, gizli bir resim ekleyin.
  • Bu görüntüyü sunarken bir çerez yerleştirin.
  • Form gönderimini işlerken tanımlama bilgisini kontrol edin.


Artıları:

  • kullanıcı ve geliştirici için uygun
  • güvenilir görünüyor
  • JavaScript yok

Eksileri:

  • bir HTTP isteği ekler
  • istemcide çerezlerin etkinleştirilmesini gerektirir


Örneğin, bu yöntem WordPress eklentisi Yorumlar için Çerezler tarafından kullanılır .


PhantomJS gibi şeyler kullanan botlar bunun üstesinden kolayca gelemez mi?
Parham Doustdar

1
Varlıkları vb. Yükleyen tam bir tarayıcı motoru olduğu için, evet bu mümkün olmalı. Yine de, muhtemelen cURL betiklerinden çok daha yavaş olduğundan, genellikle bir spam bot için kullanıldığından emin değilim.
Gras Double

bunun bir CSRF belirtecinden daha iyi olmasının herhangi bir nedeni var mı?
xenoterracide

1
CSRF jetonu botu hiç durdurmaz. 1. istek, jetonu içeren formu ALIN. 2. istek, jeton dahil formu POST.
Gras Double

4

Şey taklit edebilir (phantomjs gibi) başsız tarayıcıların çıkması ile, sen olamaz varsayalım:

  • spam botlar javascript kullanmaz,
  • botu tespit etmek için fare olaylarını izleyebilirsiniz,
  • bir alanın görsel olarak gizlendiğini görmezler,
  • göndermeden önce belirli bir süre beklemezler.

Eskiden doğruysa, artık doğru değildir.

Kullanıcı dostu bir çözüm istemiyorsanız, onlara güzel bir "spam göndericiyim" gönder düğmesi verin :

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

Elbette input[type=image], her yüklemeden sonra sırayı, metin alternatiflerini, görüntülerin içeriğini (ve boyutlarını) veya namedüğmelerin içeriğini değiştirerek iki görüntü düğmesi ile oynayabilirsiniz ; bazı sunucu çalışması gerektirecektir.

 <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" />

Erişilebilirlik nedenleriyle, doğru bir metin alternatifi koymanız gerekir, ancak uzun bir cümlenin ekran okuyucular için bot olarak görülmekten daha iyi olduğunu düşünüyorum.

Ek not: bu örnekler, bir spambot için ingilizceyi (veya herhangi bir dili) anlamanın ve basit bir seçim yapmak zorunda kalmanın, 10 saniye beklemekten, CSS veya javascript kullanmaktan, bir alanın gizli olduğunu bilmek, fare hareketini taklit etmekten daha zor olduğunu göstermektedir. klavye yazma öykünmesi, ...


Bana öyle geliyor ki, alternatif metni koymanız gerektiği gerçeği, iki görüntü çözümünüzün de diğer alternatifler kadar komut dosyası oluşturmaya duyarlı olduğu anlamına geliyor. Ve "Spam gönderen değilim" düğmesi için: bu da komut dosyası yazılamaz mı?
Hawkeye

@Hawkeye Cevabım, başsız bir tarayıcının her şeyi taklit edebileceğiydi : javascript, gecikmeler, fare hareketi, gizli alanlar, ... Örneklerimden önceki "güzel" terimi biraz "alaycı" idi. Ancak bu örnekler, İngilizceyi anlamanın ve basit bir seçim yapmanın bir spambot için şundan daha zor olduğunu göstermektedir: 10 saniye beklemek, CSS veya javascript kullanmak, bir alanın gizli olduğunu bilmek, fare hareketini taklit etmek veya klavye yazmayı taklit etmek, ...
Adam

Şimdi anlıyorum. Belki cevabınıza son cümle "Ama bu örnekler gösteriyor ..." vb. Çünkü bu, ne demek istediğini anlamama yardımcı oldu. İlk başta, "botların yapamayacağını varsayamayız ..." ama sonra botların yapamayacağını hala varsayamadığımız şeyleri listeleyeceğimiz kendi kendine çelişen bir argüman gibi görünüyordu. Ancak amacınızın püf noktası, örneğinizin (hangi gönder düğmesi konusunda bir seçim yapmak zorunda olmak) daha zor olmasıdır - ki bu (şimdi anladığıma göre) harika bir cevap. +1
Hawkeye

3

Çok basit bir yol, buna benzer bazı alanlar sağlamak <textarea style="display:none;" name="input"></textarea>ve bunları dolduran tüm yanıtları atmaktır.

Diğer bir yaklaşım, Javascript kullanarak tüm formu (veya yalnızca alan adlarını) oluşturmaktır; birkaç bot çalıştırabilir.

Her neyse, Tayvan veya Hindistan'dan gelen, yayınlanan her bağlantı için 0,03 dolar ödenen ve hayatlarını bu şekilde sağlayan canlı "botlara" karşı pek bir şey yapmayacaksınız.


2
Bu cevabın yaklaşık 7 yaşında olduğunu biliyorum ama bunun hakkında yorum yapmaya değer olduğunu düşünüyorum. Bu tür bir korumadan kaçınmak için birçok bot, style = "display: none" ile alanları yok sayacak şekilde programlanabilir.
Kenny Johnson

Girdileri gizlemek, Javascript kullanmak, üstlerinde kukla öğeleri görüntülemek, onları görünür alandan çıkarmak, arka plan veya düzen süslemelerine mükemmel bir şekilde uyum sağlamak için biçimlendirmek vb. Gibi düzinelerce yöntem vardır. of hashed => original in session server-side), isimleri ipucu olarak kullanmaya ve hangi girdilerin geçerli olduğunu manuel olarak eşlemeye karşı yardımcı olacaktır. Ne olursa olsun, manuel spam'e karşı bir savunma yoktur.
SF.

2

Spam gönderenleri durdurmak için, en azından deneyimlerime göre% 100 etkili olan ve reCAPTCHA ve benzeri yaklaşımların kullanılmasını önleyen basit bir yaklaşımım var. Bu yaklaşımı uyguladıktan sonra son 5 yılda sitelerimden birinin html formlarında günde 100'e yakın spam'den sıfıra gittim.

Çoğu html form işleme betiğinin (FormMail.pl kullanıyorum) e-posta ALIAS yeteneklerinin yanı sıra, en basit grafik programlarında kolayca yaratılan bir grafik gönderme "kodu" ile birlikte çalışır. Böyle bir grafik, M19P17nH kodunu ve "Lütfen soldaki kodu girin" komut istemini içerir.

Bu özel örnek rastgele bir harf ve sayı dizisi kullanıyor, ancak ben ziyaretçilerimin aşina olduğu kelimelerin İngilizce olmayan versiyonlarını kullanma eğilimindeyim (örneğin "pnofrtay"). Form alanı isteminin, formda görünmek yerine grafiğin içine yerleştirildiğini unutmayın. Dolayısıyla, bir robot için, bu alan, amacına ilişkin hiçbir ipucu vermez.

Buradaki tek gerçek numara, form html'nizin bu kodu "alıcı" değişkenine atadığından emin olmaktır. Ardından, posta programınızda, kullandığınız bu tür kodların her birinin, kullanmak istediğiniz e-posta adreslerini gösteren bir e-posta takma adı olarak ayarlandığından emin olun. Formda bir robotun okuması için herhangi bir bilgi istemi olmadığı ve e-posta adresi olmadığı için boş form alanına ne yazacağı konusunda hiçbir fikri yoktur. Form alanına veya kabul edilebilir kodlar dışında herhangi bir şey koymazsa, form gönderimi "kötü alıcı" hatası vererek başarısız olur. Deneyimlerime göre gerçekten gerekli olmasa da farklı formlarda farklı bir grafik kullanabilirsiniz.

Elbette, bir insan bu sorunu, reCAPTCHA ve benzer, daha zarif şemalar ile ilgili tüm problemler olmadan bir anda çözebilir. Bir insan spam göndericisi alıcı arızasına yanıt verirse ve görüntü kodunu robota programlarsa, robotun yanıt vermesi için sabit kodlandığını fark ettiğinizde bunu kolayca değiştirebilirsiniz. Bu yaklaşımı kullandığım beş yıl boyunca, kullandığım formların hiçbirinden spam almadım veya formların herhangi bir insanından şikayet almadım. Bunun robotta OCR özelliği ile yenilebileceğinden eminim, ancak html formları kullanan sitelerimde hiç böyle bir şey olmadı. Ayrıca "istenmeyen posta tuzakları" nı (istenmeyen posta önleme politikalarıma işaret eden gizli "buraya gel" html kodu) iyi bir etki için kullandım, ancak bunlar yalnızca yaklaşık% 90 etkiliydi.


1

Burada birçok şey düşünüyorum:

  1. JS kullanarak (istemeseniz de) fare hareketini, tuşa basmayı, fare tıklamasını izlemek için
  2. Yönlendirme url'sini almak (bu durumda aynı etki alanından olmalıdır) ... normal kullanıcı iletişim formuna ulaşmadan önce web sitesinde gezinmelidir: PHP: Yönlendiren URL nasıl alınır?
  3. IP'yi almak için bir $ _SESSION değişkeni kullanarak ve bu IP listesine göre form gönderimini kontrol edin
  4. Bir metin alanını, üzerine yazılmışsa sunucu tarafında kontrol edebileceğiniz bazı sahte metinlerle doldurun
  5. Tarayıcı sürümünü kontrol edin: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... Botun bir tarayıcı değil, sadece bir komut dosyası kullanacağı açıktır. .
  6. Alanları birer birer göndermek için AJAX'ı kullanın ve gönderimler arasındaki zaman farkını kontrol edin
  7. Formdan önce / sonra sahte bir sayfa kullanın, sadece başka bir giriş göndermek için

Bu adımlardan bazılarını valicu2000 üzerinde açıklayabilir misiniz? 2020'de hala geçerli mi? Teşekkürler.
Michael Moriarty

0

Pek çok web sitesinde olduğu gibi rastgele harfler ve sayılar yapmak yerine başka bir seçenek, tanınabilir nesnelerin rastgele resimlerini yapmaktır. Ardından kullanıcıdan resimdeki bir şeyin ne renk olduğunu veya nesnenin kendisinin ne olduğunu yazmasını isteyin.

Sonuç olarak, her çözümün avantajları ve dezavantajları olacaktır. Kullanıcıların antispam mekanizmasını geçemeyecek kadar zor olması ile geçebilecek spam bot sayısı arasında mutlu bir medyan bulmanız gerekecek.


İyi bir fikir. Renk körü kullanıcıları hariç tutabileceğinden, kriter olarak rengi kullanmazdım
Neil Aitken

Evet, iyi nokta. Aslında genel olarak resimlerle ilgili bir sorun, erişilebilir olmamalarıdır ve alt etiketlerle "erişilebilir" hale getirerek, robotlar bunları kolayca çözebilir.
Brian

Görüntüler her zaman kötü bir fikirdir ... metin zar zor okunabilir, bu sorunla diğer web sitelerinde karşılaştım
valicu2000

Bu sadece kullanıcılar için daha zor hale getiren çok küçük bir bükülme ile captcha. Ayrıca hiç erişilebilir değil.
Mihai P.

0

Robotlar JavaScript'i çalıştıramaz, bu nedenle sayfaya bir tür gizli öğeyi JavaScript ile enjekte etmek ve ardından form göndermeden önce varlığını tespit etmek gibi bir şey yaparsınız, ancak bazı kullanıcılarınızda JavaScript devre dışı bırakılacağından dikkatli olun.

Aksi takdirde, bir tür müşteri "insanlık" kanıtı kullanmak zorunda kalacağınızı düşünüyorum.


4
Akıllı robotlar olabilir JavaScript yürütün. Bir javascript çözümü yaparak robotların% 99'unu engelliyorsunuz
Ben Scheirman

Bot bir tarayıcı eklentisi ise, javascript çalıştırabilir ve kullanıcının gördüğü şeyleri görebilir (biraz flash veya webgl oluşturma yapıyor olsanız bile)
CoffeDeveloper

JavaScript'i devre dışı bırakan kişilerden endişeleniyorsanız, metin alanını sayfanın üstüne yerleştirmek için CSS kullanın.
Chewie The Chorkie

0

Botlar tarafından spam edilmekten kaçınmak için bulduğum en iyi çözüm, formunuzda çok önemsiz bir soru veya alan kullanmaktır.

Aşağıdakilere benzer bir alan eklemeyi deneyin:

  • Kutudaki "merhaba" kelimesini bir kenara kopyalayın
  • 1 + 1 =?
  • Web sitesi adını kutuya kopyalayın

Bu hileler, kullanıcının forma neyin girilmesi gerektiğini anlamasını gerektirir, bu nedenle büyük bot form doldurma hedefi olmayı çok daha zor hale getirir.

DÜZENLE

Sorunuzda belirttiğiniz gibi, bu yöntemin arka tarafı, kullanıcının formunu doğrulaması için fazladan bir adımdır. Ancak bence bir captcha'dan çok daha basit ve formu doldururken ek yük 5 saniyeden fazla değil ki bu da kullanıcı açısından kabul edilebilir görünüyor.


Bir kullanıcı olarak bu saçmalıktan nefret ediyorum. İstenmeyen postanın bir sorun olduğunu anlıyorum, ama site kullanıcısı olarak benim sorunum nasıl oluyor? Yorum spam'i site sahibi için bir sorundur ve bu nedenle kullanıcı bunu engelleme sorumluluğunu üstlenmemelidir. Bir mağazaya girdiyseniz ve paspaslamak istemedikleri için ayakkabılarınızın üzerine koruyucu patikler koymanız istense, o zaman düşünceleriniz ne olurdu? Sadece birkaç saniye sürüyor, ama bu senin yükün değil.
Mike

@Miki spam, bir site sahibinin zaman kaybetmesine neden olur. Vakit nakittir, sattığım şey senin için daha pahalı olacak. İddianız, "Kira ödemek zorunda olmanız umrumda değil, üretim maliyeti + 1 $ ödemek istiyorum. Kira ödüyorsunuz sorunumu nasıl ödüyorsunuz" demek için rahatlıkla kullanılabilir. Barındırma, ulaşım, zaman vb. İçin ödediğiniz bir şey satın aldığınızda
Mihai P.

@Mike - Bu senin sorunun çünkü formun çalışmasını istiyorsun (tabii ki, onu kullandığın için). Makineler en karanlık siteleri bile bulur ve her gün on binlerce gönderiyi spam olarak göndererek bu formları kullanılamaz hale getirir. Bir dahaki sefere küçük bir işletmeye web sitesinde bir form kullanarak soru gönderdiğinizde ve bunu yapmak için 9 + 3 eklemeniz gerekiyor ... ve kendinize "Bunu neden yapmam gerekiyor?" Diye sorun. cevabınız "çünkü aslında soruma bir cevap istiyorum" olabilir.
Jimbo Jonny

@JimboJonny Benim fikrimi tamamen kaçırdın. Spam (belirttiğim gibi) bir sorundur, ancak kullanıcı deneyimini bozmayan arka uçta bu sorunu çözmenin yolları vardır. Şu anda düzinelerce (yüzlerce, hatta) web sitesinde dağıtılan iletişim formlarım var ve spam minimum düzeyde (her form için birkaç spam ileti) çünkü istenmeyen postaları, kullanıcıları çemberden atlatarak değil programlı olarak ele aldım. Demek istediğim, spam'in bir sorun olmadığı değildi; bu bir sorundur. Demek istediğim, kullanıcının deneyimiyle oynamadan bunu ele almanın yolları olduğuydu.
Mike

@JimboJonny Örneği, bu soruda en yüksek dereceli (ve kabul edilen) cevaplara bakın. Hiçbiri herhangi bir kullanıcı girdisi içermez. İstenmeyen e-postaları azaltmanın yolu budur.
Mike

0

JQuery sitesinde bununla ilgili bir eğitim var. JQuery olmasına rağmen, fikir çerçeveden bağımsızdır.

JavaScript mevcut değilse, CAPTCHA türü yaklaşımına geri dönmeniz gerekebilir.


0

Bunu yapmanın kolay yolu, değeri olan bir alan koymak ve kullanıcıdan bu alandaki metni kaldırmasını istemektir. çünkü botlar yalnızca onları doldurur. alan boş değilse bu, kullanıcının insan olmadığı ve gönderilmeyeceği anlamına gelir. captcha kodunun amacı aynıdır.


0

Bu sadece bir fikir, id bunu uygulamamda kullandı ve iyi çalışıyor

javascript veya jquery ile fare hareketi üzerine bir çerez oluşturabilir ve sunucu tarafında çerezin var olup olmadığını kontrol edebilirsiniz, çünkü sadece insanların faresi vardır, çerez sadece onlar tarafından oluşturulabilir, çerez bir zaman damgası veya doğrulanabilen bir simge olabilir


İlginç fikir! Bunu gerçek dünyada hiç kullandın mı?
skybondsor

Çalışmayacak. Bu günlerde spam gönderenler tarayıcıda çalışan yazılımlar kullanıyor. Böylece, çerezi oluşturan kullanıcı deneyimini taklit edebilir ve ardından yazılım tarafından oluşturulan farklı içeriği kullanarak bunu x kez çalıştırabilirler.
Norbert Norbertson

Kullanıcı fare kullanmıyorsa bu işe yaramaz. Formunuz doğru ayarlanmışsa, kullanıcı klavyesini kullanarak tüm formu doldurabilmelidir. Sonraki alanlara geçebilir, radyo düğmelerini seçmek için boşluk çubuğunu kullanabilir ve gönder düğmesine geçtiğinizde boşluk çubuğunu (veya girebilirsiniz) kullanabilirsiniz.
Kenny Johnson

0

1) belirteçli formu kullanın 2) IP adresiyle gecikme oluşturmak için formu kontrol edin 3) IP'yi engelleyin (isteğe bağlı)


0

Deneyimlerime göre, eğer form sadece bir "iletişim" formu ise, özel önlemlere ihtiyacınız yoktur. Spam, web posta hizmetleri tarafından düzgün bir şekilde filtrelenir (e-postanıza neyin etkili bir şekilde ulaştığını görmek için sunucu komut dosyaları aracılığıyla web formu isteklerini izleyebilirsiniz, elbette iyi bir web posta hizmetiniz olduğunu varsayıyorum: D)

Btw Bunun için oturumlara güvenmemeye çalışıyorum (aşırı yüklenmeleri önlemek için bir düğmeye kaç kez tıklandığını saymak gibi).

Bunun iyi olduğunu sanmıyorum, Gerçekten de başarmak istediğim, ilgilendiğim kullanıcılar olduğu için belirli bir eylemde bulunan kullanıcılardan e-postalar almaktır (örneğin, "CV" sayfasına bakan ve uygun kişiyi kullanan kullanıcılar) form). Dolayısıyla, kullanıcı istediğim bir şeyi yaparsa, oturumunu izlemeye ve bir çerez ayarlamaya başlarım (her zaman oturum çerezi ayarlıyorum, ancak bir oturumu başlatmadığımda, kullanıcının bir oturumu olduğuna inanmak için yapılan sahte bir çerezdir). Kullanıcı istenmeyen bir şey yaparsa, onun için bir oturum tutmakla uğraşmam, bu yüzden aşırı yükleme vb.

Ayrıca, reklam hizmetlerinin, kullanıcının "reklama bakıp bakmadığını" görmek için bir tür API (belki zaten mevcut) sunması benim için güzel olurdu, reklamlara bakan kullanıcıların gerçek kullanıcılar olması muhtemeldir, ancak değillerse gerçekten iyi en azından 1 görüntüleme elde edersiniz, yani hiçbir şey kaybetmezsiniz. (ve inanın bana, reklam kontrolleri tek başınıza yapabileceğiniz her şeyden daha karmaşıktır)


0

Aslında ekranlı tuzak : hiçbiri bir cazibe gibi çalışmıyor. CSS bildirimini herhangi bir global stil sayfası içeren bir dosyaya taşımaya yardımcı olur, bu da spam botları bunları yüklemeye zorlar (bir doğrudan stil = "display: none;" bildirimi büyük olasılıkla bir spam bot tarafından yorumlanabilir. belgenin içinde yerel stil beyanı).

Bu, diğer karşı önlemlerle birleştiğinde, spam botlarının önemsizlerini kaldırmasını tartışmalı hale getirmelidir (çeşitli önlemlerle güvence altına alınmış bir misafir defterim var ve şimdiye kadar birincil tuzaklarıma düştüler - ancak herhangi bir bot bunları atlarsa, orada diğerleri tetiklemeye hazır mı).

Kullandığım şey, sahte form alanlarının bir kombinasyonudur (genel olarak CSS'yi işlemeyen veya görüntüleme: özel olarak hiçbiri olmayan bir tarayıcının kullanılması durumunda geçersiz alanlar olarak da tanımlanır ), akıl sağlığı kontrolleri (yani, girişin formatıdır) geçerli?), zaman damgası (hem çok hızlı hem de çok yavaş gönderimler), MySQL (e-posta ve IP adreslerinin yanı sıra flood filtrelerine dayalı kara listeler uygulamak için), DNSBL'ler (örneğin, Spamhaus'tan SBL + XBL), metin analizi ( örneğin, spam için güçlü bir gösterge olan kelimeler) ve doğrulama e-postaları (sağlanan e-posta adresinin geçerli olup olmadığını belirlemek için).

Doğrulama postalarıyla ilgili bir not: Bu adım tamamen isteğe bağlıdır, ancak bir kişi onu uygulamayı seçtiğinde, bu işlem mümkün olduğu kadar kolay kullanılmalıdır (yani, e-postada yer alan bir bağlantıya tıklanmalıdır. ) ve söz konusu e-posta adresinin belirli bir süre beyaz listeye alınmasına neden olur, böylece kullanıcının ek gönderi yapmak istemesi durumunda sonraki doğrulamalardan kaçınılmış olur.


0
  1. Gizli bir metin kutusunun olduğu bir yöntem kullanıyorum. Botlar web sitesini ayrıştırdığından, muhtemelen onu doldururlar. Sonra boş olup olmadığını kontrol ederim, eğer web sitesi geri dönmezse.

  2. E-posta doğrulaması ekleyin. Kullanıcı bir e-posta alır ve bir bağlantıya tıklaması gerekir. Aksi takdirde gönderiyi bir süre sonra atın.


0

Formlarıma bir zaman kontrolü ekledim. Formlar 3 saniyeden daha kısa sürede doldurulursa gönderilmeyecek ve bu özellikle uzun formlar için benim için harika çalışıyordu. İşte gönder düğmesinde çağırdığım form kontrol işlevi

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

}

0

Giderek daha karmaşık hale gelen spam botları ve otomatik tarayıcılar gibi tekniklerle, istenmeyen postanın kaynağını belirlemek zorlaşacak. Ancak yazılım, insan veya her ikisi tarafından gönderilmiş olsun, spam içeriği nedeniyle spamdir. Bence en iyi çözüm, yayınlanan içeriği Cleantalk veya Akismet gibi bir anti-spam API aracılığıyla çalıştırmaktır. Nispeten ucuz ve etkilidir ve kullanıcıyı rahatsız etmez. API'ye ulaşmadan önce daha az karmaşık botlar için form gönderme sürelerini ve diğer geleneksel kontrolleri kontrol edebilirsiniz.


Meraktan, reCAPTCHA hakkında ne düşünüyorsunuz? Diğer ücretli hizmetlerden ilk bahseden sizsiniz, ancak bunlar reCAPTCHA ile karşılaştırıldığında nasıl ve / veya neden bu hizmetleri ÜZERİNDE tavsiye ediyorsunuz?
Hawkeye

0

Javascript doğrulamasından sonra doğru eylemi ekleyerek spam robotları aldatmayı deneyebilirsiniz. Robot Javascript'i engellerse, formu asla doğru şekilde gönderemezler.

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()
    });
})

Daha sonra hataları önlemek için .attr () 'den sonra bir "geri arama" ekliyorum.


-1

Benim beş sentim değerinde. Bunun amacı, kulağa oldukça iyi gelen robotların% 99'unu durdurmaksa ve robotların% 99'u Java-komut dosyasını çalıştıramıyorsa, her şeyi geride bırakan en iyi çözüm, gönderilme eylemi olan bir form kullanmamaktır. bir gönderi URL'si.

Form java-script ile kontrol ediliyorsa ve java-script form verilerini toplar ve sonra bir HTTP isteği ile gönderirse, hiçbir robot formu gönderemez. Gönder düğmesi, formu gönderen kodu çalıştırmak için Java-komut dosyası kullanacağından.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.