prefix . 'blocked_ips'; $attempts_table = $wpdb->prefix . 'login_attempts'; $block_threshold = 5; // Anmeldeversuch in attempts-Tabelle speichern $wpdb->insert( $attempts_table, array( 'ip' => $ip, 'username' => $username, 'attempt_time' => current_time('mysql'), ), array('%s', '%s', '%s') ); // Prüfen, ob IP bereits in blocked_ips existiert $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM $blocked_table WHERE ip = %s", $ip)); if ($row) { $wpdb->update( $blocked_table, array( 'attempts' => $row->attempts + 1, 'last_attempt' => current_time('mysql'), ), array('ip' => $ip), array('%d', '%s'), array('%s') ); $attempts = $row->attempts + 1; } else { $wpdb->insert( $blocked_table, array( 'ip' => $ip, 'attempts' => 1, 'last_attempt' => current_time('mysql'), ), array('%s', '%d', '%s') ); $attempts = 1; } // IP sperren, wenn Schwellenwert erreicht if ($attempts >= $block_threshold) { wp_die( __('Deine IP-Adresse wurde aufgrund zu vieler Fehlversuche gesperrt. Bitte versuche es später noch einmal.', 'wp-multi'), __('Zugriff gesperrt', 'wp-multi'), array('response' => 403) ); } } // Hook für fehlgeschlagene Anmeldungen add_action('wp_login_failed', 'wp_multi_log_failed_login', 10, 1); // Funktion zur Erstellung der Tabellen function wp_multi_create_blocked_ips_table() { global $wpdb; $blocked_table = $wpdb->prefix . 'blocked_ips'; $attempts_table = $wpdb->prefix . 'login_attempts'; $charset_collate = $wpdb->get_charset_collate(); $version = get_option('wp_multi_blocked_ips_version', '1.0'); if (version_compare($version, '1.1', '<')) { $sql_blocked = "CREATE TABLE $blocked_table ( id mediumint(9) NOT NULL AUTO_INCREMENT, ip varchar(45) NOT NULL, attempts int NOT NULL DEFAULT 0, last_attempt datetime NOT NULL, PRIMARY KEY (id), KEY ip (ip) ) $charset_collate;"; $sql_attempts = "CREATE TABLE $attempts_table ( id mediumint(9) NOT NULL AUTO_INCREMENT, ip varchar(45) NOT NULL, username varchar(255) NOT NULL, attempt_time datetime NOT NULL, PRIMARY KEY (id), KEY ip (ip), KEY attempt_time (attempt_time) ) $charset_collate;"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta($sql_blocked); dbDelta($sql_attempts); update_option('wp_multi_blocked_ips_version', '1.1'); } } register_activation_hook(WP_MULTI_FILE, 'wp_multi_create_blocked_ips_table'); // Wöchentliche Zusammenfassung function wp_multi_send_weekly_summary() { global $wpdb; // Prüfen, ob Zusammenfassung aktiviert ist $summary_enabled = get_option('wp_multi_summary_enabled', 1); if (!$summary_enabled) { return; } $attempts_table = $wpdb->prefix . 'login_attempts'; $last_email_time = get_option('wp_multi_last_summary_email', 0); $current_time = time(); // Prüfen, ob eine Woche vergangen ist (7 Tage = 604800 Sekunden) if (($current_time - $last_email_time) < 604800) { return; } // Zeitraum für die Zusammenfassung (letzte Woche) $week_ago = date('Y-m-d H:i:s', strtotime('-7 days')); $now = date('Y-m-d H:i:s'); // Gesamtzahl der Anmeldeversuche $total_attempts = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $attempts_table WHERE attempt_time >= %s", $week_ago ) ); $total_attempts = $total_attempts ? $total_attempts : 0; // Top 10 IPs mit den meisten Anmeldeversuchen $top_attempts = $wpdb->get_results( $wpdb->prepare( "SELECT ip, username, COUNT(*) as attempt_count, MAX(attempt_time) as last_attempt FROM $attempts_table WHERE attempt_time >= %s GROUP BY ip, username ORDER BY attempt_count DESC LIMIT 10", $week_ago ) ); // E-Mail-Inhalt $message = __("Wöchentliche Anmeldeversuche-Zusammenfassung\n\n", 'wp-multi'); $message .= sprintf(__("Zeitraum: %s bis %s\n\n", 'wp-multi'), $week_ago, $now); $message .= sprintf(__("Gesamtzahl der Anmeldeversuche: %d\n\n", 'wp-multi'), $total_attempts); $message .= __("Top 10 Anmeldeversuche (nach IP und Benutzername):\n", 'wp-multi'); if ($top_attempts) { foreach ($top_attempts as $index => $attempt) { $message .= sprintf( __("%d. IP: %s, Benutzername: %s, Versuche: %d, Letzter Versuch: %s\n", 'wp-multi'), $index + 1, $attempt->ip, $attempt->username, $attempt->attempt_count, $attempt->last_attempt ); } } else { $message .= __("Keine Anmeldeversuche in diesem Zeitraum.\n", 'wp-multi'); } // E-Mail an Admin senden $admin_email = get_option('admin_email'); wp_mail( $admin_email, __('Wöchentliche Anmeldeversuche-Zusammenfassung', 'wp-multi'), $message, array('Content-Type: text/plain; charset=UTF-8') ); // Aktualisiere den Zeitstempel der letzten E-Mail update_option('wp_multi_last_summary_email', $current_time); } // Planen der wöchentlichen Zusammenfassung (jeden Montag um 8:00 Uhr) function wp_multi_schedule_weekly_summary() { if (!wp_next_scheduled('wp_multi_weekly_summary_event')) { wp_schedule_event(strtotime('next Monday 08:00'), 'weekly', 'wp_multi_weekly_summary_event'); } } add_action('wp', 'wp_multi_schedule_weekly_summary'); // Hook für die Ausführung der Zusammenfassung add_action('wp_multi_weekly_summary_event', 'wp_multi_send_weekly_summary'); // Einstellungsoption für die Zusammenfassung function wp_multi_users_register_settings() { add_option('wp_multi_summary_enabled', 1); register_setting('wp_multi_users_settings_group', 'wp_multi_summary_enabled', array( 'type' => 'integer', 'sanitize_callback' => 'absint', 'default' => 1, )); // Settings Section hinzufügen add_settings_section( 'wp_multi_security_section', __('Brute-Force-Schutz Einstellungen', 'wp-multi'), 'wp_multi_security_section_callback', 'wp_multi_users_security_settings' ); // Settings Field hinzufügen add_settings_field( 'wp_multi_summary_enabled', __('Wöchentliche Zusammenfassung', 'wp-multi'), 'wp_multi_summary_enabled_callback', 'wp_multi_users_security_settings', 'wp_multi_security_section' ); } add_action('admin_init', 'wp_multi_users_register_settings'); // Callback für die Settings Section function wp_multi_security_section_callback() { echo '
' . __('Konfiguriere die Sicherheitseinstellungen für den Brute-Force-Schutz deiner Website. Aktiviere oder deaktiviere die wöchentliche Zusammenfassung der fehlgeschlagenen Anmeldeversuche.', 'wp-multi') . '
'; } // Callback für das Settings Field function wp_multi_summary_enabled_callback() { $summary_enabled = get_option('wp_multi_summary_enabled', 1); ?> /> prefix . 'blocked_ips'; $five_days_ago = date('Y-m-d H:i:s', strtotime('-5 days')); $per_page = 50; $page = max(1, isset($_GET['paged']) ? intval($_GET['paged']) : 1); $offset = ($page - 1) * $per_page; $blocked_ips = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table_name WHERE last_attempt >= %s ORDER BY last_attempt DESC LIMIT %d OFFSET %d", $five_days_ago, $per_page, $offset ) ); $total_ips = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table_name WHERE last_attempt >= %s", $five_days_ago)); $total_pages = ceil($total_ips / $per_page); wpmt_admin_page_open( __('Blockierte IPs', 'wp-multi'), __('Vom Brute-Force-Schutz erfasste IP-Adressen der letzten 5 Tage', 'wp-multi') ); wpmt_admin_card_open(); if (empty($blocked_ips)) { wpmt_admin_notice('info', __('Keine blockierten IPs gefunden.', 'wp-multi')); } else { ?> 1) : ?>