Siteyi açalı üç hafta oldu, henüz kimse okumuyor bile, ama panelde "Yorumlar" başlığının yanında kırmızı bir rozet var: 428 bekleyen yorum. Açıyorsunuz; hepsi anlamsız İngilizce metinler, kumar sitesi bağlantıları, alakasız ilaç reklamları. WordPress spam yorum engelleme ihtiyacı neredeyse her yeni sitede aynı şekilde başlar, çünkü botlar sizi ziyaretçilerden önce bulur — WordPress'in yorum formu adresi (wp-comments-post.php) her kurulumda aynıdır ve tarayıcılar internetin tamamını bu adres için sürekli tarar.
Bu yazıda spam'i tek bir eklentiye havale etmek yerine katman katman kesmeyi anlatacağım: WordPress'in kendi Tartışma ayarlarının gerçekte ne kadar iş gördüğünü, spam'in görünmeyen büyük kaynağı olan pingback/trackback trafiğini kapatmayı, Akismet'in ticari sitelerde neden ücretli olduğunu ve ücretsiz alternatiflerin hangi durumda yettiğini, birikmiş binlerce yorumu veritabanından temizlemeyi ve son çare olarak sunucu tarafında istek sınırlamayı. Sıralama önemlidir: doğru sırayla uygulandığında spam'in büyük kısmı hiç PHP'ye ulaşmadan durur.
Spam Yorumlar Nereden Geliyor#
Spam yorum trafiğinin tamamına yakınını insanlar değil, otomatik betikler üretir ve bunlar üç farklı yoldan gelir:
- Doğrudan POST isteği. Bot sitenizi hiç açmaz;
https://siteniz.com/wp-comments-post.phpadresine, tahmin ettiği alanlarla doğrudan POST atar. Yorum formunuzu görmemesi işine engel değildir. - Pingback ve trackback. WordPress'in siteler arası bağlantı bildirim mekanizması. Bir bot, size hiç bağlantı vermeden sahte bir pingback gönderebilir; bunlar da yorum tablosuna düşer. Bu kanal, çoğu sitede spam'in yarısından fazlasını üretir ve kullanıcıların çoğu bunun yorum olarak sayıldığını bilmez.
- Tarayıcı taklidi yapan gelişmiş botlar. Sayfayı gerçekten açar, JavaScript çalıştırır, formu doldurur. Bunlar azınlıktır ama sadece bunlar captcha ve içerik analizini test eder.
Bu üç kanalın farklı savunmaları vardır. Sadece Akismet kurup bırakmak, ikinci kanalı hiç kapatmaz; sadece captcha koymak, birinci kanalı durdurmaz çünkü bot formu zaten hiç açmıyordur. Bu yüzden aşağıdaki sıralama, hem etkiyi hem eforu gözeterek düzenlenmiştir.
| Katman | Durdurduğu spam tipi | Kurulum eforu | Yan etkisi |
|---|---|---|---|
| Tartışma ayarları | Bağlantı yüklü toplu spam | 5 dakika, eklentisiz | Gerçek yorumlar da kuyruğa girebilir |
| Pingback/trackback kapatma | Sahte geri bildirim trafiği | 10 dakika | Diğer sitelerden gelen bağlantı bildirimi kaybolur |
| Honeypot | Basit form botları | 15 dakika, kod gerekir | Yok denecek kadar az |
| Captcha / Turnstile | Tarayıcı taklidi yapan botlar | 20 dakika | Kullanıcı için ek adım |
| İçerik analizi (Akismet vb.) | İnsan yazımına benzeyen spam | 10 dakika | Ticari sitede ücretli olabilir |
| Sunucu tarafı istek sınırı | Toplu POST saldırısı | 30 dakika, sunucu erişimi | Yanlış ayarda gerçek yorumu engeller |
İlk 10 Dakika: WordPress'in Kendi Tartışma Ayarları#
Hiçbir eklenti kurmadan, Ayarlar → Tartışma ekranından spam'in kayda değer bir kısmını durdurabilirsiniz. Türkçe kaynaklar bu ekranı genelde atlayıp doğrudan eklenti kurulumuna geçer; oysa buradaki üç ayar gerçekten iş görür.
1. Bağlantı sayısı sınırı. "Bir yorum, şu sayıda veya daha fazla bağlantı içeriyorsa denetim kuyruğuna alınsın" ayarı varsayılan olarak 2'dir. Spam yorumların neredeyse tamamının amacı bağlantı yerleştirmektir, dolayısıyla bu değeri 1 yapmak yakalama oranını belirgin biçimde artırır. Gerçek bir okuyucunun tek yorumda iki bağlantı vermesi nadirdir.
2. Yorum denetimi kelime listesi. "Yorum Denetimi" kutusuna yazdığınız kelimelerden birini içeren yorum onaya düşer; "Onaylanmayan Yorum Anahtarları" kutusuna yazdıklarınızı içeren yorum ise doğrudan çöpe gider. Bu ikinci kutuyu, sitenizin konusuyla hiç ilgisi olmayan tekrar eden kalıplarla doldurun. Bekleyen kuyruğunuza bakıp en sık geçen kelimeleri buradan çıkarabilirsiniz:
SELECT comment_author, COUNT(*) AS adet
FROM wp_comments
WHERE comment_approved = 'spam'
GROUP BY comment_author
ORDER BY adet DESC
LIMIT 20;
3. Daha önce onaylanmış yorum şartı. "Yorum yazarının daha önce onaylanmış bir yorumu olmalı" seçeneği açıldığında, ilk yorumu daima siz görürsünüz. Küçük ve orta ölçekli sitelerde bu tek başına yeterli bir moderasyon politikasıdır.
4. Eski yazılarda yorumları otomatik kapatma. "Şu kadar gün sonra yazılardaki yorumları kapat" ayarı, arşiv sayfalarınızı hedef alan botları tamamen dışarıda bırakır. Botlar genellikle sitemap üzerinden eski yazıları tarar; blogunuzda tartışma çoğunlukla ilk haftalarda oluyorsa 30–60 gün makul bir değerdir.
Aynı ayarları WP-CLI ile toplu uygulamak isterseniz:
wp option update comment_max_links 1
wp option update comment_previously_approved 1
wp option update close_comments_for_old_posts 1
wp option update close_comments_days_old 45
Pingback ve Trackback: Spam'in Görünmeyen Kaynağı#
Yorum kuyruğunuzda yazar adı yerine bir site adresi görünen, içeriği başlıktan kesilmiş kayıtlar varsa bunlar pingback'tir. Çoğu site sahibi bunları "yorum" sanıp tek tek siler; oysa kaynağı bir ayardan kapatmak mümkündür.
Yeni yazılar için varsayılanı kapatın (Ayarlar → Tartışma ekranındaki ilk iki kutunun işaretini kaldırın) veya komutla:
wp option update default_ping_status closed
wp option update default_pingback_flag 0
Mevcut yazıların hepsinde kapatmak için:
wp post list --post_type=post --format=ids | xargs -d ' ' -I% wp post update % --ping_status=closed
SSH erişiminiz yoksa aynı işi tek SQL sorgusuyla yapabilirsiniz (öncesinde yedek alın):
UPDATE wp_posts
SET ping_status = 'closed'
WHERE post_type IN ( 'post', 'page' );
Pingback trafiğinin taşıyıcısı XML-RPC arayüzüdür (xmlrpc.php). Bu dosya sadece spam değil, aynı zamanda toplu parola denemesi için de kullanılır. Mobil WordPress uygulaması veya Jetpack gibi uzaktan bağlanan bir aracınız yoksa tamamen kapatın; adımlar için WordPress XML-RPC kapatma yazısına bakın. Kapatmadan önce sitenizin bu arayüzü gerçekten kullanmadığından emin olun.
Kendi sitenizin kendi kendine pingback göndermesini de durdurun; bu, iç bağlantı verdiğiniz her yazıda gereksiz kayıt üretir:
<?php
// wp-content/mu-plugins/kendine-pingback-kapat.php
add_action( 'pre_ping', function ( &$links ) {
$ev = home_url();
foreach ( $links as $anahtar => $baglanti ) {
if ( 0 === strpos( $baglanti, $ev ) ) {
unset( $links[ $anahtar ] );
}
}
} );
Akismet: Ne Yapar, Ne Zaman Ücretlidir#
Akismet, WordPress ile birlikte kurulu gelen ama varsayılan olarak etkin olmayan bir spam filtresidir. Yorumun içeriğini, yazarın IP adresini ve e-posta adresini kendi sunucularına gönderir, merkezî bir veritabanıyla karşılaştırır ve "spam" ya da "temiz" cevabını döndürür. İçerik analizinde en yüksek isabet oranına sahip yöntem budur, çünkü kararı milyonlarca siteden gelen ortak veriye dayanır.
Kurulumu üç adımdır:
- Eklentiler → Yüklü Eklentiler listesinden Akismet Anti-spam'i etkinleştirin.
- Akismet hesabı oluşturup bir API anahtarı alın.
- Ayarlar → Akismet Anti-spam ekranına anahtarı yapıştırın ve "En bariz spam'i her zaman sil" seçeneğini değerlendirin.
Türkçe içeriklerde neredeyse hiç yazılmayan iki kritik nokta var:
Lisans meselesi. Akismet, kişisel ve ticari olmayan siteler için ücretsiz bir katman sunar. Sitenizde reklam varsa, ürün ya da hizmet satıyorsanız veya site bir işletmeye aitse ticari plan gerekir. Kurumsal bir sitede ücretsiz katmanı kullanmak lisans şartlarına aykırıdır ve anahtarınız iptal edilebilir. Fiyatlandırma değiştiği için burada rakam vermiyorum; kayıt sırasında hangi katmanın size uyduğunu ekranda seçmeniz istenir.
Gizlilik ve KVKK boyutu. Akismet, yorum yazan kişinin IP adresini ve e-posta adresini yurt dışındaki bir sunucuya gönderir. Bu, kişisel veri aktarımıdır ve aydınlatma metninizde belirtilmesi gerekir. WordPress bunun için yorum formunun altına bir gizlilik bildirimi çıkarma seçeneği sunar; kullanın ve aydınlatma metninize spam filtresi sağlayıcısına veri aktarıldığını yazın.
Akismet'in yakaladıkları doğrudan silinmez, Yorumlar → Spam sekmesine düşer ve 30 gün sonra otomatik temizlenir. İlk hafta bu sekmeyi kontrol edin: yanlış pozitif varsa "Spam değil" düğmesiyle geri alın, bu geri bildirim filtrenin sizin siteniz için öğrenmesini sağlar.
Akismet Dışındaki Yollar: Honeypot, Captcha ve Sunucu Tarafı Filtre#
Akismet'i kullanamayacağınız veya tek başına yetmediği durumlar için üç seçenek var.
Honeypot: eklentisiz, en düşük sürtünmeli çözüm#
Honeypot, forma ekranda görünmeyen bir alan koyar. Gerçek kullanıcı onu göremez, dolayısıyla doldurmaz; bot ise formdaki tüm alanları doldurduğu için tuzağa düşer. Basit botların önemli bir kısmını tek başına durdurur ve ziyaretçiye hiçbir ek yük getirmez:
<?php
// wp-content/mu-plugins/yorum-honeypot.php
add_action( 'comment_form_after_fields', function () {
echo '<p style="position:absolute;left:-9999px;" aria-hidden="true">'
. '<label>Bu alanı boş bırakın'
. '<input type="text" name="cl_website_url" value="" tabindex="-1" autocomplete="off">'
. '</label></p>';
} );
add_filter( 'preprocess_comment', function ( $yorum ) {
if ( ! empty( $_POST['cl_website_url'] ) ) {
wp_die(
'Yorumunuz gönderilemedi.',
'Gönderim reddedildi',
array( 'response' => 403 )
);
}
return $yorum;
} );
Alan adını cl_website_url gibi botun doldurmak isteyeceği bir şey seçmek isabet oranını artırır. Alanı display:none yerine ekran dışına taşımak, bazı botların CSS'i okuyup gizli alanları atlamasına karşı daha dayanıklıdır.
Captcha ve bot doğrulama#
Tarayıcı taklidi yapan botlar için görsel doğrulama gerekir. Modern seçenekler kullanıcıya kutucuk tıklatmak yerine arka planda tarayıcı davranışını değerlendirir, dolayısıyla dönüşüm kaybı azdır. WordPress tarafında bunu bir eklentiyle yorum formuna bağlarsınız; genel mantık ve seçenek karşılaştırması için captcha ve bot koruması yazısına bakın. Küçük bir blog için honeypot çoğu zaman yeterlidir; captcha'yı, honeypot'a rağmen spam gelmeye devam ediyorsa ekleyin.
Sunucu tarafı: isteği PHP'ye hiç ulaştırmamak#
En verimli katman budur, çünkü burada durdurulan istek ne WordPress'i yükler ne veritabanına dokunur. Klasik ve hâlâ etkili bir kural, wp-comments-post.php adresine referans başlığı olmadan gelen POST isteklerini reddetmektir; gerçek bir kullanıcı formu sizin sayfanızdan gönderdiği için referans başlığı taşır, doğrudan POST atan bot taşımaz.
Apache/LiteSpeed ortamında .htaccess dosyanıza:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} ^/wp-comments-post\.php$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?ornekalanadi\.com [NC]
RewriteRule .* - [F,L]
</IfModule>
ornekalanadi\.com kısmını kendi alan adınızla değiştirin; noktanın önündeki ters eğik çizgiyi silmeyin.
Nginx kullanıyorsanız aynı işi istek sınırlamayla yapmak daha temizdir. Dakikada iki yorumdan fazlasına izin vermeyen bir bölge tanımlayın:
# http { } bloğunun içine
limit_req_zone $binary_remote_addr zone=yorum:10m rate=2r/m;
# server { } bloğunun içine
location = /wp-comments-post.php {
limit_req zone=yorum burst=3 nodelay;
limit_req_status 429;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
Israrla aynı IP'den saldırı devam ediyorsa, bu isteklerin kayıtlarını izleyip IP'yi güvenlik duvarına aldıran bir kural yazın; kurulum için Fail2ban kurulumu yazısındaki filtre mantığını, wp-login.php yerine yorum adresini yakalayacak biçimde uyarlayabilirsiniz.
Yorumları Kısmen veya Tamamen Kapatmak#
Bazı sitelerin yoruma hiç ihtiyacı yoktur. Kurumsal tanıtım siteleri, tek sayfalık portfolyolar ve e-ticaret ürün sayfalarının çoğu bu gruptadır. Yorumu kapatmak "kaçırılmış bir etkileşim" değil, yönetim yükünü sıfıra indiren bilinçli bir tercihtir.
Yeni içerikler için varsayılanı kapatın:
wp option update default_comment_status closed
Mevcut tüm içeriklerde kapatmak için:
wp post list --post_type=any --format=ids | xargs -d ' ' -I% wp post update % --comment_status=closed --ping_status=closed
Ara bir yol da vardır ve çoğu blog için en doğru ayardır: yorumları açık bırakıp hepsini onaya düşürmek. Bu durumda spam yayına çıkmaz, sadece kuyruğunuzda birikir. Kuyruğun kendisi rahatsız ediciyse yukarıdaki katmanlarla azaltılır.
Yorumları kapatmadan önce arşivinizde gerçek okuyucu yorumu olup olmadığına bakın; kapatma işlemi mevcut yorumları silmez, sadece yeni gönderimi durdurur.
Birikmiş Spam'i Temizlemek ve Veritabanını Toparlamak#
On binlerce spam yorumu panelden sayfa sayfa silmek saatler alır ve zaman aşımına uğrar. WP-CLI ile tek komutta biter:
# Kaç tane olduğunu gör
wp comment count
# Spam olarak işaretlenmiş tüm yorumları kalıcı sil
wp comment delete $(wp comment list --status=spam --format=ids) --force
# Çöp kutusundakileri de temizle
wp comment delete $(wp comment list --status=trash --format=ids) --force
SSH yoksa phpMyAdmin'den SQL ile yapın (önce yedek alın):
DELETE FROM wp_comments WHERE comment_approved = 'spam';
DELETE FROM wp_comments WHERE comment_approved = 'trash';
Bu noktada çoğu rehberin atladığı bir adım kalır: yetim yorum meta verileri. Yorum silindiğinde wp_commentmeta tablosundaki ilgili satırlar SQL ile silme durumunda geride kalır ve tablo şişer:
DELETE cm FROM wp_commentmeta cm
LEFT JOIN wp_comments c ON c.comment_ID = cm.comment_id
WHERE c.comment_ID IS NULL;
Ardından tabloları toparlayın:
OPTIMIZE TABLE wp_comments, wp_commentmeta;
Bu temizlik yalnızca disk alanı meselesi değildir: şişmiş yorum tabloları panelin yorum ekranını ve bazı sorguları yavaşlatır. Panel genelinde bir yavaşlık da yaşıyorsanız bu adımı WordPress yönetici paneli yavaş yazısındaki teşhis akışıyla birlikte uygulayın.
Son olarak spam yorumların bıraktığı bağlantıların SEO tarafına etkisini merak ediyorsanız: WordPress yorumlardaki bağlantılara varsayılan olarak nofollow ugc niteliği ekler, dolayısıyla onaylanmamış ya da silinmiş spam yorumların sıralamanıza doğrudan zararı olmaz. Asıl risk, spam'i onaylarsanız doğar.
Sıkça Sorulan Sorular#
Akismet ticari sitelerde ücretsiz kullanılabilir mi#
Hayır, Akismet'in ücretsiz katmanı kişisel ve ticari olmayan siteler içindir. Sitenizde reklam varsa, ürün veya hizmet satıyorsanız ya da site bir işletmeye aitse ücretli bir plana geçmeniz gerekir; aksi hâlde API anahtarınız iptal edilebilir ve filtre bir gün sessizce çalışmayı bırakır. Ticari bir plana bütçe ayırmak istemiyorsanız honeypot, captcha ve WordPress'in kendi moderasyon ayarlarından oluşan üçlü katman çoğu site için yeterli sonucu verir. Kararı verirken sitenizin gerçekten kaç yorum aldığına da bakın.
Spam yorumlar SEO'ya zarar verir mi#
Onaylamadığınız sürece kayda değer bir zarar vermez. WordPress, yorumlardaki bağlantılara otomatik olarak nofollow ugc niteliği eklediği için arama motorları bu bağlantıları oy olarak saymaz; ayrıca bekleyen ve spam klasöründeki yorumlar hiç yayımlanmadığı için taranmaz bile. Gerçek risk, kuyruğu incelemeden toplu onay vermek ya da yorumları otomatik onaylayacak şekilde ayarlamaktır; o durumda sayfanız kumar ve ilaç bağlantılarına ev sahipliği yapar ve bu, güvenilirlik sinyallerini olumsuz etkiler.
Yorum formuna captcha koyunca gerçek yorumlar da azalır mı#
Klasik görsel captcha kullanırsanız evet, ölçülebilir bir azalma olur. Kullanıcıdan çarpık harf okumasını isteyen yöntemler mobilde ciddi sürtünme yaratır ve yorum yazmak zaten isteğe bağlı bir eylem olduğu için insanlar kolayca vazgeçer. Arka planda tarayıcı davranışını değerlendiren modern doğrulama yöntemleri bu kaybı büyük ölçüde ortadan kaldırır. Sıralamayı şöyle kurun: önce görünmez honeypot deneyin, spam devam ederse davranış tabanlı doğrulamaya geçin, klasik captcha'yı en sona bırakın.
Pingback'i kapatınca ne kaybederim#
Başka sitelerin size bağlantı verdiğinde otomatik bildirim gelmesini kaybedersiniz, o kadar. Bu özellik blog dünyasının erken döneminde anlamlıydı; bugün gelen pingback'lerin ezici çoğunluğu spam veya kendi sitenizin kendine verdiği iç bağlantı bildirimleridir. Size verilen gerçek bağlantıları takip etmek istiyorsanız arama konsolu araçları bu işi çok daha güvenilir yapar. Pingback'i kapatmak sitenizin bulunabilirliğini etkilemez, sadece yorum kuyruğunuzu rahatlatır.
wp-comments-post.php dosyasını silebilir miyim#
Silmeyin; her WordPress güncellemesinde geri gelir ve dosyanın yokluğu yorum gönderimini beklenmedik hatalarla bozar. Yorumları tamamen kapatmak istiyorsanız doğru yol, default_comment_status ayarını closed yapmak ve mevcut içeriklerde yorum durumunu toplu olarak kapatmaktır. Dosyanın kendisine gelen trafiği azaltmak isterseniz, silmek yerine sunucu düzeyinde referans başlığı kontrolü veya istek sınırlaması uygulayın; bu, isteği PHP'ye hiç ulaştırmadığı için hem güvenli hem verimlidir.
Bekleyen yorumları tek tek incelemek zorunda mıyım#
Hayır, kuyruğu daraltacak ayarlar var. Bağlantı sınırını 1'e çekmek, "daha önce onaylanmış yorumu olmalı" seçeneğini açmak ve onaylanmayan kelime listesine tekrar eden spam kalıplarını eklemek, kuyruğa düşen içeriğin büyük kısmını doğrudan çöpe yönlendirir. Akismet kullanıyorsanız "en bariz spam'i her zaman sil" seçeneği kuyruğu daha da küçültür. Geriye kalan az sayıdaki yorumu haftada bir kez gözden geçirmek yeterli olur; kuyruk hâlâ yüzlerce satırsa, sunucu tarafı katmanı eklemenin zamanı gelmiştir.
Spam yorumlar sunucu kaynağı tüketir mi#
Evet, özellikle doğrudan POST atan botlar ciddi yük üretir. Her yorum denemesi tam bir WordPress yüklemesi başlatır: PHP çalışır, eklentiler yüklenir, veritabanına yazma denemesi yapılır. Dakikada onlarca istek gelen bir sitede bu, paylaşımlı hosting kaynak limitlerini zorlayabilir ve site genelinde yavaşlama olarak hissedilir. Bu yüzden sunucu tarafı istek sınırlaması yalnızca bir spam önlemi değil, aynı zamanda performans önlemidir; isteği PHP'ye ulaşmadan durdurmak, sonradan filtrelemekten çok daha ucuzdur.
Kapanış#
Spam yorumla mücadelede tek bir sihirli eklenti yoktur; işe yarayan şey katmanlardır. Sırayı bozmayın: önce Tartışma ayarlarından bağlantı sınırını 1'e çekin ve ilk yorum onayını zorunlu kılın, sonra pingback/trackback kanalını ve gerekiyorsa XML-RPC'yi kapatın, ardından görünmez bir honeypot alanı ekleyin. Bunlar spam'in büyük kısmını hiçbir ücret ödemeden keser. İçerik analizine ihtiyacınız kalırsa Akismet'i lisans şartlarına uygun katmanla ekleyin, ısrarlı toplu saldırılarda ise isteği sunucu düzeyinde sınırlayın. Birikmiş yorumları temizlerken wp_commentmeta tablosundaki yetim satırları da silmeyi unutmayın — bu adım atlandığı için veritabanı temizliği çoğu zaman yarım kalır.
Bu katmanları kurmak ve düzenli olarak takip etmek istemiyorsanız, işi devretmek mantıklıdır: moderasyon ayarları, eklenti güncellemeleri ve spam kuyruğu takibi WordPress bakım hizmetinin kapsamındadır. Botların yorum adresine yaptığı toplu POST istekleri sitenizi yavaşlatacak boyuta geldiyse, isteği uygulamaya ulaşmadan filtreleyen bir web uygulama güvenlik duvarı doğru katmandır; saldırı hacmi büyüdüğünde ise DDoS koruma tarafı devreye girer. Sunucu düzeyinde istek sınırlaması ve Fail2ban kurallarını sizin yerinize yapılandıracak birini arıyorsanız sunucu yönetimi hizmeti bu işi üstlenir.