Panduan

Panduan15 menit baca

Cara menghentikan spam di formulir kontak

Hentikan spam formulir kontak dengan lapisan yang tidak membebani orang sungguhan: honeypot, waktu pengisian, skor konten, rate limit, dan pemeriksaan manusia hanya bila perlu.

Preet SutharPendiri, Ikiform

Tumpuk pemeriksaan murah yang tak terlihat sebelum menambahkan hambatan apa pun: field honeypot tersembunyi, waktu minimum mengisi formulir, skor untuk link dan frasa spam, serta rate limit per pengunjung. Tambahkan pemeriksaan manusia seperti Cloudflare Turnstile hanya jika spam masih lolos, dan verifikasi token-nya di server. Simpan yang tertangkap alih-alih membuangnya, agar Anda bisa menyelamatkan pesan asli yang sesekali ikut tersaring.

Formulir kontak di halaman publik mulai kebanjiran sampah dalam beberapa hari setelah diindeks. Sebagian besar tidak ditujukan ke Anda. Skrip menjelajahi web mencari <form> apa pun, mengisi setiap input, lalu mengirimnya, berharap ada link yang tertanam di suatu tempat. Sebagian kecil datang dari browser sungguhan yang dikendalikan software, dan sebagian lagi dari orang yang dibayar untuk menempelkan tawaran yang sama ke ribuan formulir. Setiap jenis dihentikan oleh pemeriksaan yang berbeda, itulah sebabnya satu trik saja tidak pernah cukup.

Panduan ini menjelaskan setiap pertahanan, apa yang ditangkapnya, dan apa biayanya bagi pengunjung sungguhan, dengan kode yang bisa dijalankan di stack apa pun. Lalu panduan ini menunjukkan bagaimana Ikiform, sebuah form backend, menjalankan lapisan yang sama untuk Anda.

Lapisan, dari yang termurah

Urutkan pemeriksaan berdasarkan biayanya. Menghitung request hampir gratis, jadi dijalankan sebelum body dibaca. Pemeriksaan yang memanggil layanan lain, seperti captcha, dijalankan setelah yang murah lolos. Penilaian konten berjalan terakhir, karena butuh field yang sudah di-parse. Ikiform menjalankan pemeriksaannya dalam urutan ini untuk setiap kiriman.

Urutan pemeriksaan spam, dari kiriman masuk hingga disimpan atau dianggap spamLangsung ditolakDiberi skor, lalu tetap disimpankirimantibadari halaman,skrip, atauserverrate limitterlalubanyak darisatupengunjung:429domainyangdiizinkandikirim darisitus lain?pemeriksaanmanusiatokenTurnstile,jika aktifhoneypotterisi: +5waktu dankontenterlalu cepat,link, frasa,berulangskor 5ataulebih?diterimaemail danwebhookterkirimspamjawabansukses sama,tak ada yangdikirimhitungorigintokentidakyaUrutan pemeriksaan spam, dari kiriman masuk hingga disimpan atau dianggap spamLangsung ditolakDiberi skor, lalu tetap disimpankiriman tibadari halaman, skrip,atau serverrate limitterlalu banyak darisatu pengunjung:429domain yangdiizinkandikirim dari situslain?pemeriksaanmanusiatoken Turnstile,jika aktifhoneypotterisi: +5waktu dan kontenterlalu cepat, link,frasa, berulangskor 5 ataulebih?diterimaemail dan webhookterkirimspamjawabansuksessama, takada yangdikirimhitungorigintokentidakya
  1. Sebuah kiriman tiba di endpoint formulir.
  2. Rate limit menghitung kiriman per pengunjung terlebih dulu. Banjir kiriman ditolak dengan 429 sebelum body dibaca.
  3. Domain yang diizinkan membandingkan halaman asal kiriman dengan domain yang Anda daftarkan.
  4. Jika pemeriksaan manusia aktif, kiriman harus membawa token Turnstile yang valid.
  5. Honeypot menambah 5 ke skor jika terisi.
  6. Waktu pengisian, link, frasa spam yang dikenal, alamat sekali pakai, dan kiriman berulang menambah nilai yang lebih kecil.
  7. Pada skor 5 atau lebih, kiriman disimpan sebagai spam. Di bawahnya, kiriman diterima dan email serta webhook Anda terkirim.
Baris atas menolak kiriman. Baris bawah tidak pernah menolak: ia memberi skor, sehingga false positive cukup dipulihkan dengan satu klik, bukan pesan yang hilang.

Perbandingan pertahanan

Setiap pertahanan mengorbankan sesuatu. Tabel ini jujur tentang apa yang terlewat oleh masing-masing dan apa yang dimintanya dari orang yang ingin Anda dengar.

PertahananMenghentikanMelewatkanBiaya bagi pengunjung sungguhan
HoneypotSkrip yang mengisi setiap inputBot yang membaca CSS atau melewati field tersembunyi, dan manusiaTidak ada, asalkan tersembunyi dari screen reader dan autofill
Jebakan waktuKiriman yang lebih cepat dari kecepatan siapa pun mengetikBot lambat, dan bot yang sengaja menungguTidak ada, selama batas minimumnya beberapa detik
Penilaian konten, seperti jumlah link, frasa spam, atau AkismetTawaran SEO, sebar link, spam kasino dan obatSpam yang tampak bersih, dan bisa salah menandai pesan asli yang berisi linkTidak ada, asalkan Anda meninjau yang tertangkap
Rate limitingBanjir kiriman dan skrip yang berulangSpam lambat yang tersebarKantor dan acara di balik satu IP bisa terkena batas yang ketat
Domain yang diizinkanKiriman yang dikirim langsung ke endpoint Anda dari tempat lainSkrip yang memalsukan header OriginTidak ada
Cloudflare TurnstileSebagian besar browser otomatisSpammer manusia bayaranBiasanya tak terlihat. Kadang perlu satu klik, dan butuh skrip
reCAPTCHA atau hCaptchaSebagian besar browser otomatisSpammer manusia bayaran dan layanan pemecah captchaTeka-teki gambar untuk sebagian pengunjung, ditambah skrip pihak ketiga

Mulailah dengan lima yang pertama. Semuanya tak terlihat dan menangkap sebagian besar spam yang diterima situs kecil. Tambahkan pemeriksaan manusia saat dashboard menunjukkan spam masih lolos, jangan sebelumnya: itu satu-satunya lapisan yang biayanya terasa oleh setiap pengunjung. Halaman tentang menghentikan spam tanpa captcha menunjukkan seberapa jauh lapisan tak terlihat bisa bekerja sendiri.

Baca spamnya sebelum melawannya

Lihat sepuluh pesan spam sebelum memilih solusi. Kesamaan di antara mereka memberi tahu siapa pengirimnya, dan itu menunjuk ke lapisan yang bisa menghentikannya.

Dari tampilan spam ke lapisan yang menghentikannyateks acak di setiapfieldbot skripparse HTML, isi semuainputhoneypotpuluhan per menit,satu sumberskrip yang berulangrate limitkiriman rapi < 1detik setelah dimuatheadless browserjebakan waktu,pemeriksaan manusiatawaran sopan denganlinkorang, dibayar performulirskor konten,tinjauanYang Anda lihatSiapa pengirimnyaYang menghentikannyaDari tampilan spam ke lapisan yang menghentikannyateks acak di setiap fieldbot skripparse HTML, isi semua inputhoneypotpuluhan per menit, satusumberskrip yang berulangrate limitkiriman rapi < 1 detiksetelah dimuatheadless browserjebakan waktu, pemeriksaanmanusiatawaran sopan dengan linkorang, dibayar performulirskor konten, tinjauan
  1. Teks acak di setiap field berasal dari skrip yang mengisi semua input. Honeypot menangkapnya.
  2. Puluhan kiriman per menit dari satu sumber berasal dari skrip yang berulang. Rate limit menghentikannya.
  3. Kiriman rapi yang dikirim dalam satu detik setelah halaman dimuat berasal dari headless browser. Jebakan waktu atau pemeriksaan manusia menghentikannya.
  4. Tawaran sopan berisi link berasal dari orang yang dibayar per formulir. Hanya penilaian konten dan tinjauan Anda sendiri yang bisa menangkapnya.
Tidak ada captcha yang bisa menghentikan baris terakhir. Manusia bisa memecahkannya, jadi penilaian konten dan pengecekan folder spam tiap minggu adalah satu-satunya pertahanan.

Formulir kontak dengan semua lapisan terpasang

Berikut satu formulir kontak, dibuat untuk setiap stack. Setiap versi punya honeypot di luar layar dan pemeriksaan manusia. Versi khusus browser memakai pemeriksaan Turnstile terkelola dari Ikiform, yang tidak butuh key. Versi server menunjukkan cara mandiri: server Anda memverifikasi token Turnstile dengan key Cloudflare Anda sendiri, lalu meneruskan field-nya. Pilih stack Anda di bawah; pilihan itu berlaku untuk setiap contoh kode di panduan ini.

Tab server berbagi dua helper kecil. verifyTurnstile menanyakan ke Cloudflare apakah token itu asli, dan sendToIkiform meneruskan field dengan secret key Anda dan header Origin milik pengunjung. Fetch dari sisi server tidak mengirim Origin sendiri, dan Ikiform membacanya untuk mengenali uji gratis dari localhost. Keduanya gagal secara tertutup: jika Cloudflare tidak bisa dihubungi, pengunjung melihat error, bukan lolos diam-diam.

lib/spam.ts
const SITEVERIFY = "https://challenges.cloudflare.com/turnstile/v0/siteverify";
const ENDPOINT = "https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx";

export interface Contact {
  name: string;
  email: string;
  message: string;
  _gotcha: string;
}

export function readContact(data: FormData): Contact {
  return {
    name: String(data.get("name") ?? "").trim(),
    email: String(data.get("email") ?? "").trim(),
    message: String(data.get("message") ?? "").trim(),
    _gotcha: String(data.get("_gotcha") ?? ""),
  };
}

export async function verifyTurnstile(input: { secret: string; token: string; ip?: string | null }) {
  if (!input.token || input.token.length > 2048) return false;
  const body = new URLSearchParams({ secret: input.secret, response: input.token });
  if (input.ip) body.set("remoteip", input.ip);
  try {
    const response = await fetch(SITEVERIFY, { method: "POST", body });
    const result = (await response.json()) as { success?: boolean };
    return result.success === true;
  } catch {
    return false;
  }
}

export async function sendToIkiform(secretKey: string, contact: Contact, origin?: string | null) {
  try {
    const response = await fetch(ENDPOINT, {
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json",
        Authorization: `Bearer ${secretKey}`,
        ...(origin ? { Origin: origin } : {}),
      },
      body: JSON.stringify(contact),
    });
    const result = await response.json().catch(() => null);
    if (result?.ok) return { ok: true as const };
    const fields: Record<string, string[]> = result?.error?.fields ?? {};
    const first = Object.values(fields)[0]?.[0];
    return {
      ok: false as const,
      status: response.status,
      message: String(first ?? result?.error?.message ?? "Couldn't send your message. Try again."),
    };
  } catch {
    return { ok: false as const, status: 502, message: "Couldn't reach the form service. Try again." };
  }
}

Formulir biasa tidak butuh skrip. Atur Spam check formulir Ikiform ke Ikiform, dan kiriman tanpa token mendapat halaman pemeriksaan singkat di ikiform.com yang menjalankan Turnstile lalu meneruskan field-nya. Orang yang lolos tanpa terlihat tidak akan menyadarinya.

contact.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required maxlength="120" />

  <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" rows="5" required minlength="10" maxlength="5000"></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 message</button>
</form>

<style>
.hp {
  position: absolute;
  left: -10000px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}
</style>

Honeypot diletakkan di luar layar, bukan di balik display: none, karena sebagian bot melewati field yang disembunyikan dengan cara itu. aria-hidden pada wrapper dan tabindex pada input menjauhkan screen reader dan keyboard darinya.

  • Setiap versi memakai class .hp dari blok style di tab HTML. Taruh di CSS global Anda.
  • Honeypot diberi nama _gotcha, default Ikiform. Versi server meneruskannya apa adanya, jadi yang terisi tetap masuk ke folder spam Anda dengan alasan honeypot.
  • Turnstile menambahkan input tersembunyi cf-turnstile-response ke formulir. Token berlaku 300 detik dan hanya bisa dipakai sekali, jadi setiap percobaan butuh token baru.
  • Key uji dari Cloudflare memungkinkan Anda menjalankan semua ini secara lokal. Panduan Turnstile mencantumkannya.
Versi sisi server mengirim dengan secret key, sehingga Ikiform melewati Allowed domains dan pemeriksaan manusianya. Semua kiriman lalu datang dari IP server Anda, dan batas Standard 5 per menit per pengunjung menghitung semua pengunjung Anda sebagai satu. Pilih rate limit Relaxed atau Custom untuk formulir yang Anda kirim lewat server, dan simpan IKIFORM_SECRET_KEY di environment variable khusus server.

Coba definisi field di bawah. Ini menjalankan validator Ikiform di browser Anda, dengan aturan yang sama yang diterapkan server sebelum skor spam dihitung.

Pratinjau

Menjalankan validator Ikiform di browser Anda. Tidak ada yang dikirim.

Field-nya sama dengan template formulir kontak. Tempel definisinya di tab Fields formulir dan Ikiform menolak kiriman yang tidak cocok dengan 422 validation_failed.

Honeypot

Honeypot adalah input yang tidak pernah dilihat orang tetapi diisi oleh bot. Jika ada nilainya, kiriman itu berasal dari software. Tidak ada biaya bagi pengunjung, dan honeypot menangkap bot tertua dan paling umum, yang mem-parse HTML dan mengisi setiap input yang ditemukannya.

Menyembunyikannya dengan baik lebih penting daripada triknya sendiri. Tiga hal sering salah pada honeypot yang dibuat sembarangan:

  • Screen reader membacakannya. Pengunjung tunanetra mendengar field tambahan, mengisinya, lalu ditandai sebagai spam. Bungkus dengan aria-hidden="true" dan beri label yang meminta field itu dikosongkan.
  • Keyboard berhenti di sana. Menekan Tab di formulir berhenti di input yang tak terlihat. tabindex="-1" mengeluarkannya dari urutan tab.
  • Autofill mengisinya. Browser dan password manager mengisi field berdasarkan nama. Beri nama field email2 atau phone dan sebagian akan mengisinya untuk orang sungguhan. Pakai nama yang tidak dikenali autofill, seperti _gotcha, dan tambahkan autocomplete="off".

Panduan honeypot membahas teknik menyembunyikan, cara bot mendeteksinya, dan pemeriksaan sisi server untuk setiap stack. Dengan Ikiform, honeypot yang terisi menambah 5 ke skor, yang sudah mencapai ambang 5 dengan sendirinya. Anda bisa mengganti nama field per formulir di Honeypot field.

Waktu pengisian

Orang butuh beberapa detik untuk mengisi formulir kontak. Banyak bot hanya butuh milidetik. Jebakan waktu mencatat kapan formulir dirender dan memeriksa selisihnya saat dikirim. Versi naifnya menaruh timestamp di field tersembunyi:

Jebakan waktu, versi naif
const started = Number(formData.get("started"));
const seconds = (Date.now() - started) / 1000;
const tooFast = !Number.isFinite(seconds) || seconds < 3;

Bot bisa mengirim angka apa saja, jadi timestamp biasa hanya menghentikan bot yang tidak repot-repot. Tanda tangani di server dengan secret, dan bot tidak bisa memalsukan waktu render yang lebih lambat. Halaman tentang menghentikan spam tanpa captcha membangun versi bertanda tangan.

Ikiform menandatangani waktu render untuk Anda saat formulir berasal dari SDK atau komponen shadcn/ui: keduanya mengirim _ikiform_ts, dan kiriman kurang dari 2 detik setelah render menambah 3 ke skor. Timestamp palsu atau yang berumur sehari juga menambah 3. Formulir HTML biasa tidak mengirimnya dan tidak dikenai penalti.

Menilai konten

Sebagian spam diketik atau ditempel oleh manusia, jadi lolos dari setiap pemeriksaan bot. Yang membongkarnya adalah kontennya: link, frasa jualan, alamat sekali pakai, dan teks yang sama dua kali. Beri skor pada setiap sinyal dan anggap total yang tinggi sebagai spam, alih-alih memblokir berdasarkan satu sinyal saja. Satu link dalam pesan itu wajar; link di field nama tidak pernah wajar.

SinyalIkiform menambah
Honeypot terisi+5
Link di field nama atau subjek+3
Field yang sama dikirim ke formulir ini dalam 24 jam terakhir+3
Dikirim kurang dari 2 detik setelah waktu render bertanda tangan+3
Tiga link atau lebih di semua field+2
Salah satu dari 22 frasa spam yang dikenal, seperti "seo services"+2
Alamat di domain email sekali pakai+2

Pada skor 5 atau lebih, kiriman dianggap spam. Tidak ada satu sinyal lunak yang mencapainya sendirian: pesan asli dengan tiga link mendapat skor 2. Dua sinyal bersamaan sering mencapainya, seperti link di nama dan frasa spam. Jika Anda menilai konten sendiri, Akismet adalah opsi hosted yang sudah lama ada; banyak tim memulai dengan beberapa regular expression seperti di atas.

Pemeriksaan manusia

Pemeriksaan manusia meminta browser membuktikan bahwa ia dikendalikan oleh manusia. Yang modern, seperti Cloudflare Turnstile, sebagian besar berjalan tanpa terlihat dan hanya menampilkan checkbox jika ragu. Widget memberi browser sebuah token; server Anda harus mengirim token itu ke penyedia untuk diverifikasi. Token yang tidak pernah diverifikasi di server tidak menghentikan apa pun, karena bot bisa melewati widget dan mengirim tanpanya.

Ikiform punya tiga pengaturan di Spam check pada setiap formulir:

PengaturanYang terjadiPerubahan kode
Off (the default)Tanpa tantangan. Honeypot, waktu pengisian, dan skor tetap berjalan.Tidak ada
IkiformTurnstile dijalankan Ikiform di ikiform.com, tanpa akun atau key CloudflareTidak ada untuk kiriman HTML. Kiriman fetch memanggil challenge() dari @ikiform/sdk terlebih dulu
Your own Turnstile keys (key Turnstile Anda sendiri)Widget dan secret key Anda. Ikiform memverifikasi token dan mencocokkan hostname-nya dengan domain yang diizinkanRender widget di formulir Anda agar mengirim cf-turnstile-response

Kiriman fetch tanpa token mendapat 403 challenge_required. Jika Cloudflare tidak bisa dihubungi, Ikiform tetap menerima kiriman dan menyimpannya sebagai spam dengan alasan captcha_unavailable, sehingga Anda bisa memulihkannya. Dokumentasi spam menunjukkan kedua alur. Jika Anda menimbang Turnstile dibandingkan reCAPTCHA dari Google atau hCaptcha, lihat alternatif reCAPTCHA.

Rate limit dan domain yang diizinkan

Rate limit membatasi seberapa sering satu pengunjung bisa mengirim. Ia tidak membedakan spam dari pesan asli; ia menghentikan volume. Hitung per IP dan formulir, izinkan lonjakan kecil, dan jawab 429 dengan header Retry-After. Panduan rate limiting membangunnya untuk setiap stack dan menjelaskan mengapa penghitung in-memory gagal di hosting serverless.

Ikiform menghitung setiap kiriman secara tepat, sebelum membaca body. Setiap formulir memilih preset: Standard, 5 per menit per pengunjung, Relaxed, 20 per menit per pengunjung, atau Strict, 2 per 10 menit per pengunjung. Standard juga mengizinkan maksimal 3 per 10 detik, dan seluruh formulir menerima 300 per menit. Formulir kontak cocok dengan Strict, karena tidak ada orang jujur yang menulis dua kali dalam sepuluh menit. Angkanya ada di Rate limit.

Allowed domains mencantumkan situs tempat formulir Anda berada. Kiriman dari halaman lain ditandai sebagai spam, atau ditolak dengan 403 origin_not_allowed jika Anda memilih Reject. Ini mencegah orang mengarahkan formulir mereka sendiri ke endpoint Anda. Skrip yang gigih bisa memalsukan header yang diperiksanya, jadi anggap ini satu lapisan, bukan kunci.

Apa yang terjadi pada spam

Jangan pernah memberi tahu bot bahwa ia tertangkap. Error mengajarinya apa yang harus diubah; halaman sukses biasa tidak mengajarinya apa-apa. Dan jangan pernah menghapus spam begitu masuk: setiap filter sesekali menangkap pesan asli, dan yang sudah dihapus hilang selamanya.

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.

Buka filter status di dashboard dan pilih Spam untuk melihat masing-masing beserta skor dan alasannya. Not spam memindahkannya kembali, dan email serta webhook-nya terkirim saat itu. Matikan email hari Senin di Weekly spam summary pada pengaturan workspace. Spam disimpan 30 hari, jadi cek minimal sebulan sekali.

Jika ada satu pesan asli yang terus tertangkap, baca alasannya. Link di field bernama business_name dinilai sebagai link di nama; ganti nama field menjadi business dan field itu tidak lagi dihitung sebagai field nama.

Pilih situasi Anda

Setiap halaman ini membahas lebih dalam satu pertahanan atau satu jenis situs, dengan kode untuk kasus itu.

Pastikan berfungsi

Jalankan ini pada formulir uji sebelum Anda mengandalkannya. Ikiform tidak punya paket gratis. Pengujian gratis: workspace tanpa paket menerima 50 kiriman uji per bulan dari localhost. Untuk go live, pilih Pro mulai $6/bln untuk 500 kiriman, atau bayar sekali: 10.000 kiriman seharga $49 atau 50.000 kiriman seharga $149, dengan kredit yang tidak pernah kedaluwarsa. Lihat harga.

  1. Di Allowed domains formulir, tambahkan domain situs Anda, ditambah localhost selama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja.
  2. Isi formulir di halaman Anda dan kirim. Anda mendarat di halaman terima kasih Anda, atau halaman hosted milik Ikiform.
  3. Buka Submissions di dashboard. Kiriman baru ada di sana dengan setiap field yang Anda kirim.
  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 dengan link di field nama dan frasa seo services di pesan. Kiriman disimpan sebagai spam dengan alasan url_in_name dan keyword.
  6. Ubah Spam check ke Ikiform lalu kirim formulir HTML biasa. Anda melihat halaman pemeriksaan sebentar, lalu halaman terima kasih Anda.
  7. Kirim formulir beberapa kali berturut-turut. Setelah melewati batas, formulir menjawab 429 dan pengunjung melihat halaman perlambat dari Ikiform.
  8. Tidak ada yang masuk? Ubah filter status di dashboard ke Spam. Spam mendapat jawaban sukses yang sama dengan kiriman asli.

Pemecahan masalah

MasalahYang harus dilakukan
Kiriman ada di dashboard tetapi tidak ada email atau webhook yang datangKiriman itu disimpan sebagai spam. Spam tidak mengirim apa pun. Buka di filter Spam untuk melihat alasannya, dan tandai sebagai bukan spam untuk mengirim email dan webhook-nya.
403 challenge_requiredSpam check formulir diatur ke Ikiform dan kiriman fetch tidak membawa token. Dapatkan token dengan challenge(formId) dari @ikiform/sdk sebelum setiap pengiriman, atau matikan pemeriksaannya.
403 origin_not_allowed, atau setiap kiriman masuk ke spamDomain halaman tidak ada di Allowed domains formulir. Tambahkan, ditambah localhost untuk uji lokal. Subdomain dari domain yang terdaftar diizinkan.
429 rate_limitedSatu pengunjung mengirim melebihi rate limit formulir. Standard mengizinkan 5 per menit per pengunjung. Tunggu sesuai Retry-After, atau pilih Relaxed atau Custom untuk formulir yang mengirim dari satu IP bersama.
403 captcha_failedToken Turnstile tidak ada, kedaluwarsa, atau dipakai dua kali. Token berlaku 300 detik dan hanya sekali pakai, jadi render widget baru, atau panggil challenge() lagi, setelah setiap percobaan.
Spam masih masuk sebagai diterimaBuka salah satunya dan cari kesamaannya dengan yang lain. Spam dari skrip perlu Spam check diatur ke Ikiform; tawaran yang diketik manusia perlu rate limit yang lebih ketat dan tinjauan mingguan.
Pengunjung sungguhan melaporkan tidak bisa mengirimPastikan honeypot tersembunyi dari screen reader dan diberi nama yang dilewati autofill, dan rate limit yang ketat tidak menjebak orang di balik satu IP kantor.

Pertanyaan

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