Hentikan spam formulir kontak

Hentikan spam formulir kontak5 menit baca

Cara menambahkan field honeypot yang diisi bot tetapi tidak oleh manusia

Tambahkan honeypot ke formulir apa pun yang menangkap bot tanpa mengganggu screen reader, keyboard, atau autofill, dengan pemeriksaan server untuk setiap stack.

Preet SutharPendiri, Ikiform

Tambahkan satu input teks ekstra yang Anda sembunyikan di luar layar, keluarkan dari urutan tab, dan bungkus dengan aria-hidden, dengan nama yang tidak diisi otomatis oleh browser mana pun. Manusia tidak pernah mengisinya; bot yang mengisi setiap input akan mengisinya. Di server, anggap setiap kiriman yang field itu berisi nilai sebagai spam, dan jawab persis seperti untuk pesan asli.

Apa yang berbeda dari honeypot

Honeypot harus menjadi dua hal sekaligus. Bagi bot yang membaca HTML, ia harus terlihat seperti field biasa yang layak diisi. Bagi setiap orang, ia harus tidak ada, termasuk orang yang memakai formulir dengan cara berbeda dari Anda: pengguna screen reader, orang yang menavigasi dengan keyboard, orang yang formulirnya diisi oleh password manager. Sebagian besar bug honeypot datang dari melupakan salah satu orang ini, dan gejalanya adalah pesan asli yang diam-diam masuk ke spam.

Bagaimana manusia dan bot bertemu field honeypot yang samaManusia, dengan browser atau teknologi bantu apa punBot skripmengisiformulirlayar,keyboard, atauscreen readerjebakandilewatidi luar layar,tabindex -1,aria-hiddenautofillmelewatinyanama yang takdikenalibrowserditerimajebakan kosongparse HTMLtemukan setiapinputisisemuanyatermasukjebakanlangsungkirimspamjawaban suksessamaBagaimana manusia dan bot bertemu field honeypot yang samaManusia, dengan browser atau teknologi bantu apa punBot skripmengisi formulirlayar, keyboard, atau screenreaderjebakan dilewatidi luar layar, tabindex -1,aria-hiddenautofill melewatinyanama yang tak dikenali browserditerimajebakan kosongparse HTMLtemukan setiap inputisi semuanyatermasuk jebakanlangsung kirimspamjawaban sukses sama
  1. Seseorang mengisi formulir dengan apa pun yang ia pakai: layar, keyboard, atau screen reader.
  2. Jebakan ada di luar layar, di luar urutan tab, dan tersembunyi dari teknologi bantu, jadi ia tidak pernah mencapainya.
  3. Namanya tidak diisi otomatis oleh browser dan password manager, jadi tetap kosong.
  4. Kiriman tiba dengan jebakan kosong dan diterima.
  5. Bot skrip mem-parse HTML dan menemukan setiap input, termasuk jebakannya.
  6. Bot mengisi semuanya dan langsung mengirim.
  7. Jebakan berisi nilai, jadi kiriman dianggap spam. Bot tetap mendapat jawaban sukses biasa.
Setiap pengaman di baris atas menutup satu jalan bagi orang sungguhan untuk mencapai field itu. Hilangkan salah satunya dan baris atas pun bisa berakhir di spam.

Markup-nya

Taruh jebakan di dalam formulir, di samping field asli, sebagai input teks biasa. Input type="hidden" tidak berhasil: bot tahu orang tidak bisa mengeditnya, dan membiarkannya.

contact.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />
  <label for="message">Message</label>
  <textarea id="message" name="message" required></textarea>

  <div class="hp" aria-hidden="true">
    <label for="hp-field">Leave this empty</label>
    <input id="hp-field" name="_gotcha" type="text" tabindex="-1" autocomplete="off" />
  </div>

  <button>Send</button>
</form>
gaya
<style>
.hp {
  position: absolute;
  left: -10000px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}
</style>
  • aria-hidden="true" pada wrapper menghapus label dan input dari accessibility tree, sehingga screen reader tidak membacakannya.
  • tabindex="-1" mencegah tombol Tab berhenti di input yang tidak terlihat siapa pun.
  • Labelnya berbunyi Leave this empty (biarkan kosong). Jika ada alat yang masih menampilkan field itu, orang yang membacanya tahu apa yang harus dilakukan.
  • Jangan tambahkan required. Field wajib yang tidak bisa dilihat orang memblokir setiap kiriman yang jujur.

Cara menyembunyikannya

Bot sudah belajar melewati field yang jelas-jelas tersembunyi. Scraper sederhana masih mengisi semuanya, tetapi sebagian memeriksa atribut hidden atau display: none inline sebelum mengetik. Semakin jauh penyembunyiannya dari input itu sendiri, semakin banyak bot yang terjebak.

TeknikTersembunyi dari manusiaBot yang masih tertangkap
Atribut hidden atau display: none inlineYaHanya yang paling sederhana. Ini hal pertama yang diperiksa bot yang lebih pintar
Class di luar layar di stylesheet AndaYaSebagian besar. Bot harus memuat dan menerapkan CSS Anda untuk mengetahuinya
opacity: 0 atau ukuran nolSebagian besar. Beberapa pembesar layar dan outline fokus masih menampakkannyaSebagian besar, tetapi lebih berisiko bagi manusia
Ditambahkan JavaScript setelah halaman dimuatYaBot yang menjalankan skrip. Scraper HTML biasa tidak pernah melihatnya, jadi mereka lolos

Pakai class di luar layar dari stylesheet Anda. Cara ini menangkap bot paling banyak dan paling aman bagi manusia. Jika satu honeypot berhenti bekerja, tambahkan yang kedua dengan nama berbeda, alih-alih trik penyembunyian yang lebih cerdik.

Pilih nama yang diabaikan autofill

Browser dan password manager mengisi field dengan menebak dari name, id, label, dan nilai autocomplete-nya. autocomplete="off" hanyalah petunjuk, dan sebagian browser mengabaikannya untuk field yang terlihat seperti alamat atau detail kontak. Jadi nama yang sebenarnya berperan.

HindariAlasanGunakan sebagai gantinya
email2, phone, name, addressAutofill mengenalinya dan mengisinya untuk orang sungguhan_gotcha, company_website
honeypot, trap, botSebagian bot melewati field dengan nama yang mencolokNama yang membosankan tetapi masuk akal
url, website sajaSebagian alat autofill mengisi field website dari profil tersimpanNama gabungan seperti company_website

Periksa di server

Honeypot hanya berfungsi jika server membacanya. Pemeriksaan di sisi browser tidak berguna, karena bot tidak pernah menjalankan skrip Anda. Saat field berisi nilai, jawab persis seperti untuk pesan asli, dan jangan simpan atau teruskan kirimannya. Jawaban yang berbeda memberi tahu bot field mana yang membongkarnya. Contoh di bawah memanggil saveMessage milik Anda sendiri; ganti dengan apa pun yang menyimpan atau mengirim email pesan itu.

Formulir HTML biasa tidak punya server sendiri. Arahkan ke Ikiform dan beri nama jebakannya _gotcha, atau ganti namanya per formulir di Honeypot field. Ikiform melakukan pemeriksaan server, dan jebakan tidak pernah disimpan sebagai jawaban.

contact.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />
  <label for="message">Message</label>
  <textarea id="message" name="message" required></textarea>

  <div class="hp" aria-hidden="true">
    <label for="hp-field">Leave this empty</label>
    <input id="hp-field" name="_gotcha" type="text" tabindex="-1" autocomplete="off" />
  </div>

  <button>Send</button>
</form>
Catat kiriman yang terjebak, meskipun tidak Anda simpan. Hitungan per hari memberi tahu apakah honeypot masih berguna, dan penurunan mendadak ke nol berarti bot sudah belajar melewatinya.

Cara Ikiform menangani honeypot

Setiap formulir Ikiform punya honeypot bernama _gotcha secara default. Ganti per formulir di Honeypot field pada pengaturan formulir; nama apa pun yang Anda pilih dicadangkan dan tidak pernah disimpan sebagai jawaban. Honeypot yang terisi menambah 5 ke skor spam, yang sudah mencapai ambang 5 dengan sendirinya.

Ikiform tidak membuang kirimannya. Kiriman disimpan sebagai spam, jadi jika suatu saat orang sungguhan terkena jebakan, Anda bisa menemukan pesannya dan memulihkannya. Kiriman yang dinilai spam mendapat jawaban sukses yang sama dengan kiriman asli, jadi bot tidak belajar apa-apa. Kiriman itu disimpan dengan status spam, tidak mengirim email notifikasi maupun webhook, tidak dihitung dalam pemakaian Anda, dan dihapus setelah 30 hari. Setiap Senin, workspace yang memblokir spam menerima satu email ringkasan berisi total, formulir tersibuk, dan alasan teratas. Dokumentasi spam dan formulir HTML berisi referensinya.

Pastikan berfungsi

  1. Muat formulir dengan screen reader aktif dan telusuri. Jebakan tidak pernah dibacakan.
  2. Tekan Tab di sepanjang formulir. Fokus berpindah dari field asli terakhir langsung ke tombol.
  3. Biarkan browser dan password manager mengisi formulir otomatis. Jebakan tetap kosong.
  4. Kirim dengan honeypot terisi, _gotcha=bot. Kiriman tetap mendapat jawaban sukses, tetapi disimpan sebagai spam dan tidak memicu email atau webhook.
  5. Kirim pesan biasa. Pesan masuk sebagai diterima, tanpa jejak field jebakan.

Hal yang sering menjebak

  • Kiriman JSON. Jika Anda menyusun body secara manual alih-alih dengan FormData, sertakan jebakannya, atau server Anda akan membacanya kosong untuk bot juga.
  • Pembuat formulir yang mengganti nama field. Sebagian pembuat situs memberi awalan atau mengganti nama input. Cek body yang dikirim, bukan editornya, untuk mengetahui nama asli jebakan.
  • Cache. Jika halaman yang di-cache masih memakai nama jebakan lama setelah Anda menggantinya, kiriman datang dengan nama lama dan lolos. Ganti nama di kedua sisi sekaligus.
  • Honeypot checkbox. Checkbox tersembunyi juga bisa, tetapi screen reader menangani checkbox nyasar lebih buruk daripada input teks. Utamakan input teks.
  • Hanya satu lapisan. Bot yang menjalankan browser sungguhan dan melewati field tak terlihat bisa lolos dari honeypot apa pun. Pasangkan dengan rate limit dan, jika perlu, pemeriksaan manusia.

Pertanyaan

Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.