Gereksinimler ve Ön Hazırlık
Bu sistemi uygulamaya başlamadan önce geliştirme ortamınızın hazır olduğundan emin olmalısınız. Çalışmalarınızı doğrudan canlı (production) sitenizde yapmadan önce bir yerel sunucu (LocalWP veya XAMPP gibi) üzerinde test etmeniz önerilir.
- PHP 8.2 veya üzeri bir sürüm.
- WordPress 6.5 veya güncel bir sürüm.
- Temanızın
functions.phpdosyasına erişim veya kendi özel eklentinizi oluşturma yetkisi. - Veritabanı işlemleri için temel SQL bilgisi.
Kritik Uyarı: Veritabanı üzerinde işlem yapacağınız için mutlaka tam bir site yedeği alın. Hatalı bir SQL sorgusu sitenizin erişilemez hale gelmesine neden olabilir.
Adım 1: Log Verileri İçin Özel Tablo Oluşturma
WordPress'in standart tabloları yerine, log verilerini saklamak için özel bir tablo oluşturmak performansı artırır ve verilerinizi düzenli tutar. Aşağıdaki kod, eklenti veya tema aktif edildiğinde veritabanında wp_user_login_logs adında bir tablo oluşturur.
function create_login_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'user_login_logs';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
username varchar(100) NOT NULL,
ip_address varchar(45) NOT NULL,
action varchar(20) NOT NULL,
log_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'create_login_log_table');
Bu kod bloğunda dbDelta fonksiyonu kullanılmıştır. Bu fonksiyon, tablonun zaten var olup olmadığını kontrol eder ve gerekirse güncellemeleri otomatik olarak yapar, böylece veritabanı yapınız her zaman güncel kalır.
Adım 2: Giriş Başarılı Olduğunda Log Kaydetme
Kullanıcı sisteme giriş yaptığında tetiklenen wp_login kancasını kullanarak veritabanına kayıt ekleyeceğiz. Bu adımda kullanıcının IP adresi ve giriş zamanı gibi kritik verileri yakalıyoruz.
add_action('wp_login', 'log_user_login', 10, 2);
function log_user_login($user_login, $user) {
global $wpdb;
$table_name = $wpdb->prefix . 'user_login_logs';
$wpdb->insert(
$table_name,
array(
'user_id' => $user->ID,
'username' => $user_login,
'ip_address' => $_SERVER['REMOTE_ADDR'],
'action' => 'login',
'log_time' => current_time('mysql')
),
array('%d', '%s', '%s', '%s', '%s')
);
}
Burada $wpdb->insert metodu kullanılarak SQL Injection saldırılarına karşı hazırlıklı oluyoruz. Veri türlerini belirten format dizisi (%d, %s) veritabanı güvenliği için zorunludur.
Adım 3: Çıkış İşlemlerini Loglama
Kullanıcılar sistemden çıkış yaptıklarında tetiklenen wp_logout kancasını kullanarak çıkış loglarını kaydedebiliriz. Bu, kullanıcının oturum süresini analiz etmek için oldukça değerlidir.
add_action('wp_logout', 'log_user_logout');
function log_user_logout() {
$user = wp_get_current_user();
if ($user->ID == 0) return;
global $wpdb;
$table_name = $wpdb->prefix . 'user_login_logs';
$wpdb->insert(
$table_name,
array(
'user_id' => $user->ID,
'username' => $user->user_login,
'ip_address' => $_SERVER['REMOTE_ADDR'],
'action' => 'logout',
'log_time' => current_time('mysql')
),
array('%d', '%s', '%s', '%s', '%s')
);
}
wp_get_current_user() fonksiyonu ile çıkış yapan kullanıcının bilgilerini alıyoruz. Eğer kullanıcı girişi yoksa (ID 0 ise) işlem yapmadan fonksiyonu sonlandırıyoruz.
Adım 4: Logları Yönetim Panelinde Görüntüleme
Topladığınız verileri WordPress yönetim panelinde bir tablo olarak görüntülemek için add_menu_page fonksiyonunu kullanabiliriz. Bu sayede veritabanına girmeden logları görebilirsiniz.
add_action('admin_menu', 'add_login_logs_menu');
function add_login_logs_menu() {
add_menu_page('Giriş Logları', 'Giriş Logları', 'manage_options', 'login-logs', 'render_login_logs_page');
}
function render_login_logs_page() {
global $wpdb;
$logs = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}user_login_logs ORDER BY log_time DESC LIMIT 50");
echo 'Kullanıcı Giriş/Çıkış Logları
';
echo 'Kullanıcı İşlem IP Tarih ';
foreach($logs as $log) {
echo "{$log->username} {$log->action} {$log->ip_address} {$log->log_time} ";
}
echo '
';
}
Bu kod, veritabanından en son 50 kaydı çeker ve WordPress'in kendi CSS sınıflarını (widefat) kullanarak yönetici paneliyle uyumlu bir tablo oluşturur.
Karşılaştırma: Loglama Yöntemleri
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Özel Tablo (Bu Rehber) | Yüksek performans, kolay sorgulama. | Veritabanı boyutu artar. |
| Dosyaya Yazma | Veritabanını yormaz. | Okuması ve yönetmesi zordur. |
| Eklenti Kullanımı | Kurulumu kolaydır. | Siteyi yavaşlatabilir, güvenlik riski taşır. |
Güvenlik Sorumluluk Reddi: Bu rehberdeki kodlar eğitim amaçlıdır. Üretim ortamında kullanmadan önce veritabanı sorgularında $wpdb->prepare kullanarak tüm girdileri sanitize ettiğinizden emin olun. Kodların sorumluluğu kullanıcıya aittir.
Sıkça Sorulan Sorular
Log tablosu çok büyürse ne yapmalıyım?
Log tablonuzun çok büyümesini engellemek için bir "temizleme" fonksiyonu yazarak 30 günden eski kayıtları otomatik silen bir WP-Cron görevi oluşturabilirsiniz.
Başarısız giriş denemelerini de kaydedebilir miyim?
Evet, wp_authenticate_user kancasını kullanarak başarısız giriş denemelerini de aynı tabloya kaydedebilirsiniz.
Bu sistem siteyi yavaşlatır mı?
Sadece giriş ve çıkış anında birer kayıt eklediği için sitenizin genel performansına etkisi ihmal edilebilir düzeydedir.
IP adresleri neden önemli?
IP adresleri, siber saldırıları tespit etmek ve aynı hesaba farklı konumlardan erişim olup olmadığını kontrol etmek için hayati verilerdir.
Logları dışa aktarabilir miyim?
Yönetim paneline bir "CSV Olarak Dışa Aktar" butonu ekleyerek veritabanındaki verileri kolayca dışa aktarabilirsiniz.
Log Verilerini Otomatik Temizleme (Cron Job)
Veritabanınızın şişmesini önlemek için, belirli bir süreden (örneğin 30 gün) eski olan kayıtları otomatik olarak silen bir zamanlanmış görev (Cron Job) oluşturmak en iyi uygulamadır. WordPress'in yerleşik WP-Cron sistemini kullanarak bu işlemi şu şekilde otomatize edebilirsiniz:
// 30 günden eski logları silmek için fonksiyon
function custom_log_cleanup_cron() {
global $wpdb;
$table_name = $wpdb->prefix . 'user_login_logs';
$days_to_keep = 30;
$date_limit = date('Y-m-d H:i:s', strtotime("-$days_to_keep days"));
$wpdb->query(
$wpdb->prepare("DELETE FROM $table_name WHERE log_time < %s", $date_limit)
);
}
// Cron görevini tanımla
if (!wp_next_scheduled('custom_log_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'custom_log_cleanup_event');
}
add_action('custom_log_cleanup_event', 'custom_log_cleanup_cron');
Güvenlik İçin İleri Düzey Loglama İpuçları
Sadece giriş/çıkış saatlerini kaydetmek bazen yeterli olmayabilir. Güvenliğinizi bir üst seviyeye taşımak için loglarınıza şu ek verileri de dahil etmeyi düşünebilirsiniz:
- User-Agent Bilgisi: Kullanıcının hangi tarayıcı ve işletim sistemi üzerinden giriş yaptığını kaydeder. Bu, bot saldırılarını ayırt etmede yardımcı olur.
- HTTP Referer: Kullanıcının giriş sayfasına nereden yönlendirildiğini takip eder.
- İşlem Başarısı (Status): Girişin başarılı mı yoksa hatalı şifre denemesi mi olduğunu bir sütunda (örneğin
status) tutun.
Aşağıdaki kod bloğu, giriş sırasında kullanıcının tarayıcı bilgisini nasıl alabileceğinizi gösterir:
// Giriş loguna User-Agent ekleme örneği
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$wpdb->insert(
$table_name,
array(
'user_id' => $user->ID,
'log_time' => current_time('mysql'),
'ip_address'=> $_SERVER['REMOTE_ADDR'],
'user_agent'=> $user_agent
)
);
Not: Kullanıcı verilerini toplarken, KVKK ve GDPR gibi veri gizliliği düzenlemelerine uyum sağlamak için kullanıcılarınızı "Gizlilik Politikası" sayfanızda bu verilerin tutulduğu konusunda bilgilendirdiğinizden emin olun.
Hata Ayıklama ve Test Süreci
Sistemin düzgün çalışıp çalışmadığını test etmek için geliştirme aşamasında WP_DEBUG modunu aktif etmeniz önerilir. Logların veritabanına yazılıp yazılmadığını kontrol etmek için şu basit sorguyu kullanabilirsiniz:
// Veritabanı sorgusunu test etme
$last_logs = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}user_login_logs ORDER BY log_time DESC LIMIT 5");
error_log(print_r($last_logs, true)); // Debug.log dosyasına yazar
Eğer loglar veritabanına düşmüyorsa, öncelikle wp_login kancasının tetiklenip tetiklenmediğini kontrol edin. Bazı özel giriş eklentileri (örneğin iki faktörlü doğrulama eklentileri) standart WordPress giriş kancalarını atlayabilir; bu durumda eklentinin sunduğu özel kancaları kullanmanız gerekebilir.
Sonuç
WordPress üzerinde özel bir kullanıcı giriş çıkış log sistemi kurmak, sitenizin güvenlik katmanını güçlendirmenin etkili bir yoludur. Bu rehberde, veritabanı tablosu oluşturmadan başlayarak, kancalar ile verileri yakalamayı ve bunları yönetim panelinde görüntülemeyi öğrendiniz. Bir sonraki adım olarak, bu logları belirli bir süre sonra otomatik silen bir cron job ekleyerek veritabanı optimizasyonunu tamamlayabilirsiniz.


Yorumlar (0)
Yorum Yaz