Misafirler ve spam koruması
5 dk okuma
Ziyaretçilerin gönderebildiği formlar birkaç gün içinde botların hedefi olur. Bu eklentinin her formu aşağıdaki denetimleri kendiliğinden, hiçbir kurulum gerektirmeden çalıştırır; isterseniz üstüne bir CAPTCHA da ekleyebilirsiniz.
Denetimler, sırasıyla
# | Check | Applies to | Message the visitor sees |
|---|---|---|---|
1 | License active | herkes | "This form is not available right now." |
2 | Honeypot | herkes | "Your entry could not be sent." |
3 | Security proof: signed token (guests) or nonce (logged in) | herkes | aşağıya bakın |
4 | Access rules | herkes | "Please log in to use this form." / "You are not allowed to use this form." |
5 | Rate limit | herkes | "Too many entries were sent from here. Please try again later." |
6 | Your CAPTCHA filter | herkes | kendi mesajınız ya da "Your entry could not be verified. Please try again." |
7 | Duplicate guard | herkes | "This entry was already sent. Please wait a moment before sending it again." |
8 | Values, required fields, uploads | herkes | hata listesi |
Her reddedilme, formu girilen değerlerle ve Your entry was not sent: kutusuyla yeniden gösterir.
Misafirler: imzalı belirteç
Oturum açmamış bir ziyaretçi WordPress nonce'u kullanamaz (nonce'lar ziyaretçiye özeldir ve sayfa önbelleğini bozar). Bunun yerine form bir belirteç (token) taşır: formun oluşturulduğu zaman, sitenizin gizli salt değeri ve formun anahtarıyla imzalanır. Gizli bir alandır, bu yüzden sayfa kaynağında görebilirsiniz.
- Belirteç en az 3 saniyelik olmalıdır. Anında gönderim yapan bir bot reddedilir: "The form was sent too quickly. Please wait a moment and send it again."
- Belirteç 24 saatten yeni olmalıdır. Daha eski, eksik, bozuk veya yabancı (başka bir form için üretilmiş) belirteçler şu mesajı verir: "The form has expired. Please check your entry and send it again."
- Sayfadaki belirteç bir saatten eskiyse sayfadaki bir betik sunucudan yeni bir belirteç ister (
GET /wp-json/wpmcf/v1/forms/{key}/token, herkese açık bir rota); böylece önbelleğe alınmış bir sayfa günlerce çalışmaya devam eder. - Oturum açmış kullanıcılar bunun yerine bir nonce gönderir. Oturumları değişmişse (örneğin başka bir sekmede çıkış yapmışlarsa) şunu görürler: "Your session has changed. Please check your entry and send it again."
Bu nedenle form içeren sayfa, misafirler için bir sayfa önbelleğinden sunulabilir. Önbelleğinizin oturum açmış ziyaretçilere önbelleğe alınmış bir kopya sunmadığından emin olun.
Honeypot
Her formda wpmcf_form_website adlı gizli bir metin kutusu bulunur ("Leave this field empty" etiketli, CSS ile ve ekran okuyuculardan gizlenmiş, odaklanılamaz). İnsanlar bunu asla doldurmaz; birçok bot ise tüm kutuları doldurur. İçinde değer bulunan bir gönderim, başka hiçbir şeye bakılmadan reddedilir.
Rate limit
Varsayılan olarak bir gönderen, form başına 10 dakikada 5 kabul edilen girişe sahip olabilir. Gönderen, oturum açmış kullanıcı veya ziyaretçinin IP adresidir (yalnızca karma olarak saklanır). Reddedilen girişler (eksik alan, yanlış CAPTCHA, hatalı dosya) sayılmaz: bir yazım hatasını düzelten kişi asla kilitlenmez.
Bunu bir filtreyle değiştirebilirsiniz, örneğin küçük bir eklentide:
add_filter( 'wpmcf/forms/rate_limit', function ( array $limit, $form, int $user_id ): array {
// 20 entries per hour; use 'max' => 0 for no limit at all.
return [ 'max' => 20, 'window' => HOUR_IN_SECONDS ];
}, 10, 3 );max giriş sayısıdır (0 = sınırsız), window ise saniye cinsinden süredir. Filtre formu (bir FormDTO) ve geçerli kullanıcı kimliğini alır; böylece form veya rol başına farklı sınırlar belirleyebilirsiniz.
Sayaçlar, kalıcı bir nesne önbelleğiniz varsa onda, yoksa transient'lerde tutulur. Kalıcı nesne önbelleği olmadan, tam aynı anda gelen iki istek birlikte geçebilir; sıkı bir sınır için Redis veya Memcached kullanın.
Proxy veya CDN arkasında: ziyaretçi IP'si
Hız sınırı (ve yinelenme koruması) gerçek ziyaretçi IP'sine ihtiyaç duyar. Eklenti varsayılan olarak sunucunuza bağlanan adresi (REMOTE_ADDR) kullanır, çünkü X-Forwarded-For gibi başlıklar ziyaretçi tarafından yazılabilir ve bu yüzden varsayılan olarak güvenilemez.
Bir CDN veya ters proxy arkasında (Cloudflare, yük dengeleyici, Varnish, barındırma proxy'si) REMOTE_ADDR, proxy'nin adresidir; bu nedenle tüm ziyaretçiler tek bir sınırı paylaşır ve on dakika içindeki ilk beş giriş herkesi engeller. Bunu wp-config.php dosyasında, /* That's all, stop editing! */ satırının üstünde düzeltin:
// Cloudflare
define( 'WPMCF_CLIENT_IP_HEADER', 'HTTP_CF_CONNECTING_IP' );
// A reverse proxy that sets X-Forwarded-For (the first address of the list is used)
define( 'WPMCF_CLIENT_IP_HEADER', 'HTTP_X_FORWARDED_FOR' );- Değer,
$_SERVERgirdisinin adıdır: başlık adı büyük harflerle, tireler alt çizgi olarak yazılır ve önüneHTTP_eklenir. - Başlık bir liste içeriyorsa (
203.0.113.9, 10.0.0.1) ilk adres kullanılır. Geçersiz bir değerREMOTE_ADDRdeğerine döner. - Bunu yalnızca proxy'niz bu başlığın üzerine her zaman gerçek adresi yazıyorsa ayarlayın. Bir ziyaretçi başlığı kendisi gönderebiliyorsa istediği adresi seçip sınırdan kaçabilir.
- Tam denetim için
wpmcf/forms/client_ipfiltresini kullanın; filtre adresi alır ve geçerli bir IP döndürmelidir:
add_filter( 'wpmcf/forms/client_ip', fn( string $ip ): string => $_SERVER['HTTP_X_REAL_IP'] ?? $ip );Duplicate guard
Aynı göndericiden aynı forma 30 saniye içinde gelen aynı giriş (aynı alan değerleri ve dosya adları/boyutları) şu mesajla reddedilir: "This entry was already sent. Please wait a moment before sending it again." Bu, çift tıklamaları ve yenilenen "yeniden gönder" iletişim kutusunu engeller. Reddedilen veya başarısız bir gönderim korumayı hemen serbest bırakır, böylece düzeltip yeniden göndermek çalışır. Kalıcı nesne önbelleği olmadan koruma atomik değildir: tam aynı anda gelen iki istek de geçebilir.
Kendi CAPTCHA'nız
Eklentinin kendi CAPTCHA'sı yoktur, ancak kaydetmeden önce size sorar. Kabul etmek için true, reddetmek için false veya mesajı ziyaretçiye gösterilen bir WP_Error döndürün:
add_filter( 'wpmcf/forms/verify_submission', function ( $ok, $form, array $request ) {
$token = $request['cf-turnstile-response'] ?? ''; // the field your CAPTCHA widget posts
if ( $token === '' || ! my_site_verify_turnstile( $token ) ) {
return new WP_Error( 'captcha', 'Please prove you are human.' );
}
return $ok;
}, 10, 3 );$formform tanımıdır (yalnızca bazı formları korumak için$form->keykullanın).$requestgönderilen veridir; slash'leri kaldırılmıştır ve temizlenmemiştir: güvenilmez kabul edin.- Filtre, yerleşik denetimlerden ve hız sınırı kotanız ayrıldıktan sonra çalışır; reddedilirse kota geri verilir.
- Filtre yalnızca sunucu tarafı denetimidir. Eklenti formun içine bir widget basmaz; CAPTCHA entegrasyonunuz yanıt alanını formun POST verisine eklemelidir (birçok CAPTCHA betiği bir sayfadaki her forma kendiliğinden bağlanır).
wpmcf/forms/verify_submissionoturum açmış kullanıcılar için de çalışır; orada CAPTCHA istemiyorsanız onlar için$okdeğerini döndürün.
Kimler gönderebilir (erişim)
Form düzenleyicide Who can submit ayarı bir formu Logged-in users veya Users with a capability (edit_others_posts gibi bir WordPress yetki adı) ile sınırlar. Erişim form gösterilirken ve gönderilirken olmak üzere iki kez denetlenir, bu yüzden değiştirilmiş bir istek bunu aşamaz. Post formlarında düzenleme sırasında ayrıca ziyaretçinin WordPress'te o yazıyı düzenleme izni olması gerekir. Bkz. Form oluşturma.
Ziyaretçiden gelen hangi veriye asla güvenilmez
- Formla gönderilen bir yazı veya kullanıcı kimliği: profil formu oturumu kullanır; bir yazı yalnızca WordPress o kullanıcının düzenlemesine izin veriyorsa düzenlenir.
- Image veya File alanı için bir ek (attachment) kimliği: yalnızca girişin zaten sahip olduğu dosya korunabilir; başka her kimlik yok sayılır, böylece bir ziyaretçi başkasının ortam dosyasını ekleyemez.
- Kayıt için bir rol: her zaman formda belirlenen roldür.
- Gönderimden sonraki dönüş adresi: sitenizde olmalıdır.
- Parolalar tarayıcıya asla geri gönderilmez ve karma (hash) olarak saklanır.
Geliştiriciler için
wpmcf/forms/rate_limit,wpmcf/forms/client_ip,wpmcf/forms/verify_submission: yukarıda açıklandı.- Sabit
WPMCF_CLIENT_IP_HEADER: yukarıda açıklandı. - Belirteç rotası
GET /wp-json/wpmcf/v1/forms/{key}/tokenşeklindedir ve yalnızca etkin bir form için{"token": "..."}yanıtını verir.
Hâlâ takıldınız mı? Destek ile iletişime geçin