WordPress Arama Sorgularına Limit Koymak!

Her zamanki gibi popülaritesini devam ettiren meşhur CMS yazılımımız WordPress ilgi odağı olmaya devam ediyor. Diğer bir yandan da biz kullanıcılar istek listemizi birazcık abartıyor olabiliriz… WordPress’de şu özellik olsa süper olurdu! Eklentiler arasında kesin vardır! Ya ben özel bir istekte bulunabilir miyim?

Bu gece özel bir istekte bulundum. Aslında hiç de özel olacağını düşünmemiştim? WordPress databasesi büyüdükçe bazı sorgular canınızı sıkmaya başlıyor. Hele ki sürekli ziyaret edilen bir sisteme sahipseniz, daha az CPU ve RAM kullanmak için sitenizin temasını bile çöpe atıp, beyaz zemine yazmaya razı olabilirsiniz.

Neden mi?

Şimdi adam diyor ki yüz milyon ziyaretçi gelsin, hostinge fazla para vermeyeyim… Velhasıl kelam benzer bir durumla karşılaştım. Kullandığım tema Bülent Sakarya’nın elinden çıkan bir tema, mümkün olduğunca az sorgu ve minimum eklenti ile çalışıyor. Hatta hiç yok diyebilirim. Neyse fark ettim ki…

teakolik.com/?s=1

Şeklinde bloguma bir istek geldiği zaman arama sorgusu tüm databasede yapılıyor ve birazcık mysql’e yük biniyor. Çok az öyle ashım şahım değil. Ancak bu sorguyu saldırganlar (kötü niyetli akıllı çocuklara selamlar) saniyede birkaç defa yapar ve birkaç saniyede onlarca hatta yüzlerce istek gönderirlerse MYSQL biraz şişiyor. İstekler arttıkça Mysql’e binen yük artıyor ve sonunda sunucu cevap vermez duruma geliyor.

DDOS’un yandan yemiş hali…

Elbette buna bir çözüm bulmak lazımdı. Yani arama sorgularını kısıtlayabilmeliydim? İlk başlarda eklentileri aradım, maalesef ki doğru düzgün bir şey bulamadım. Sonra WordPress’in fonksiyonlarını inceledim. Ancak arama sorguları için bir limit fonksiyonu göremedim. Sonrasında ise Google’ın dibini gördüm…

Yapacak ve araştıracak bir yer kalmadığında Facebook’un duvarına, Twitter’ın 140 karakterine sarıldım… Sağ olsun arkadaşlar imdadıma yetişti.

Yazılımcılar nasıl da belli oluyor…

Öncelikle imdadıma yetişen herkese teşekkürlerimi sunarım. Hasan Yaşar‘ın yaktığı kıvılcım ile Tarık Çayır ve Serkan Algur yorum kutularında hemen kod yazmaya başladılar. Türle Numan ise sağ olsun DM’den yürüdü. Keyifli de oldu çok güzel kodlar çıktı ortaya. WordPress için ip başına arama limiti koyma isteğim, Serkan Algur’un Github hesabında ardından Türle Numa’ın Github hesabında son halini aldı. Sizlerle de bu kodu paylaşmak istedim.

[mavi]Bu kodları temanızın functions.php dosyası içerisinde en alt satırına eklerseniz. WordPress blogunuzda veya sitenizde arama yapan kişiye belirli limitler tanımlayabilirsiniz.[/mavi]

Bu limitleri aştıkları zaman 30 dakika kadar bloke edilir. Süre bitene kadar da beklemek zorunda kalır. Kodları incelerseniz gayet temiz ve rahat olduğunu göreceksiniz. Kodlar kullanıcının veya isteği yapan kötü niyetli akıllı arkadaşların ip adresini alıyor ve limiti aştığı zaman bloke ediyor. Süre bitene kadar bekletiyor. Süre bittiğinde siteye girebilir ve yeniden limitler dahilinde sorgu atabilir.

Bu sayede WordPress sisteminize fazla yük bindiremez… Peki bu kodlar Spoof IP’leri engeller mi? Elbette ki hayır, ancak ikinci aşamada bunu da düşünmeye başlayabiliriz 🙂 Ne dersiniz ortaya bir all-in-one-wordpress-search-limit eklentisi çıkar mı? 🙂

/* Surekli Aramayı Bloke Ettim*/

// Get user IP in WordPress
function get_the_user_ip() {
if ( ! empty( $_SERVER[‘HTTP_CLIENT_IP’] ) ) {
//check ip from share internet
$ip = $_SERVER[‘HTTP_CLIENT_IP’];
}else {
$ip = $_SERVER[‘REMOTE_ADDR’];
}
return apply_filters( ‘wpb_get_ip’, $ip );
}

function search_visitor_ip_block($query) {

// Visitor search limit
$visitorIPLimit = 25;

if(preg_match(‘ /google|yandex|yndx|spider|bot|slurp|msn|bing|adsbot|AdIdxBot| search|face|baidu|duck|sogou|youdao|ccbot|alexa| microsoft/i’,gethostbyaddr(get_the_user_ip()))){
// bot dedect
return $query;
}else {

$visitorIPCount = get_option( ‘visitor_ip_count’.get_the_user_ip() );

//Daha Zamanı var mı soralım
$is_block = get_transient( ‘visitor_ip_block’.get_the_user_ip() );
$will_deleted = get_option(‘visitor_ip_block’.get_the_user_ip().’-deleteafter30min’);

//Sonrasında blok kontrolü yapalım
if($is_block == ‘blocked’) :
wp_die(‘Sakin Ol Şampiyon? Daha Çayın Bitmemiş :)’);
else :
//Daha varmış normal prosedür devam etsin
if ( $query->is_search ) :
if(($visitorIPCount >= $visitorIPLimit) && $will_deleted == ‘yes’) :
delete_option(‘visitor_ip_count’.get_the_user_ip());
delete_option(‘visitor_ip_block’.get_the_user_ip().’-deleteafter30min’);

//Limitimizden aşağıda mı kontrol edip ekleyelim
elseif( $visitorIPCount < $visitorIPLimit ) :
$visitorIPCount += 1 ;
update_option( ‘visitor_ip_count’.get_the_user_ip(), $visitorIPCount );
return $query;
else :
//30 Dakika engel için geçici opsiyon atayalım
set_transient(‘visitor_ip_block’.get_the_user_ip(),’blocked’,30);
update_option(‘visitor_ip_block’.get_the_user_ip().’-deleteafter30min’,’yes’);
//Sorguyu öldürelim
wp_die(‘Sakin ol şampiyon? Canın cay mı çekti?’);
endif;
endif;
endif;

}
}

//hook filters to search
add_filter(‘pre_get_posts’,’search_visitor_ip_block’);

 

Yorum yapan, beğenen, destek veren ve yardımcı olan herkese tekrardan teşekkürler…

“WordPress Arama Sorgularına Limit Koymak!” üzerine 7 yorum

  1. Konuyla ilgili hiç araştırma yapmadım bu arada aydınlatıcı bir yazı olmuş elinize sağlık

    Yanıtla
  2. Bununla ilgili bir şeyler yapmak istiyordum ama tesadüfen de olsa işime yarayacak bir şey bulmuş oldum. Emeği geçen herkese teşekkürler.

    Bir de şunu sorayım: Kalan süreyi de anlık gösterebilseydi daha mı iyi olurdu sanki?

    Yanıtla
  3. Hamza bey gerçekten faydalı bir hizmet olmuş siz ve yardımcı olan arkadaşlara çok teşekkür ederim. ancak bahsettiğiniz gibi bu kod bir eklenti ile sitemize yerleştirebilsek bizim gibi kod bilmeyen insanlar için daha kolay olur. inşallah ilerleyen zamanlarda bunuda yapma fırsatınız olur. Ellerinize sağlık

    Yanıtla
  4. Teşekkürler bu yararlı içerik için. Bu ülkeden insanların böyle evrensel değerde işlere katkı sağladığını görmek gerçekten mutluluk verici. İşte tüketen değil üreten, katkı sağlayan olmak. Yalnız merak ettiğim şey WordPress’te veya Jetpack eklentisinde dahili olarak böyle bir önlemin olmamasının nedeni nedir? Eklenti değil dahili olmalı bence. Dünya kadar güvenlik uygulaması var belki onlarda vardır dahili olarak bilemedim.

    Yanıtla
  5. Şimdi hit olayı çok olan siteleri rahatlatmak için olabilir. Çok hitim olsun da bunu kullanmasam da olur.

    Yanıtla

Yorum yapın