WordPress ist das weltweit am häufigsten genutzte CMS - und genau das macht es zu einem beliebten Ziel für Hacker. Die Standard-Login-URL /wp-admin kennt jeder Angreifer, und ungenutzte Kommentarfunktionen bieten zusätzliche Angriffsflächen. In diesem Artikel zeige ich dir zwei essenzielle Code-Snippets, um deine WordPress-Installation deutlich sicherer zu machen.
Warum WordPress-Sicherheit so wichtig ist
Täglich werden tausende WordPress-Websites angegriffen. Die häufigsten Angriffsvektoren:
- Brute-Force-Attacken auf
/wp-admin - Spam über Kommentarfunktionen
- SQL-Injection über Formulare
- Veraltete Plugins mit bekannten Sicherheitslücken
Die gute Nachricht: Mit ein paar Zeilen Code in der functions.php kannst du deine Website deutlich besser schützen.
1. Admin-URL verschieben (Security by Obscurity)
Die Standard-Login-URL /wp-admin ist ein offenes Tor für Bots und automatisierte Angriffe. Indem du diese URL auf etwas Individuelles änderst, reduzierst du die Anzahl der Login-Versuche massiv.
Der Codeschnipsel
Füge folgenden Code in deine functions.php ein:
<?php
/**
* WordPress Admin-URL ändern
*
* Verschiebt /wp-admin auf eine custom URL für mehr Sicherheit
* WICHTIG: Merke dir die neue URL gut!
*/
// Definiere deine neue Admin-URL (z.B. /geheim-admin/)
define('CUSTOM_ADMIN_URL', 'geheim-admin');
// Blockiere direkten Zugriff auf /wp-admin
add_action('init', 'custom_admin_url_redirect');
function custom_admin_url_redirect() {
// Nur bei direktem Aufruf von wp-admin
if (strpos($_SERVER['REQUEST_URI'], '/wp-admin') !== false
&& strpos($_SERVER['REQUEST_URI'], 'admin-ajax.php') === false) {
// Prüfe ob custom URL im Request ist
if (strpos($_SERVER['REQUEST_URI'], CUSTOM_ADMIN_URL) === false) {
// Leite zur Startseite weiter (404 wäre zu auffällig)
wp_redirect(home_url());
exit;
}
}
}
// Neue Login-URL aktivieren
add_action('login_init', 'custom_login_url');
function custom_login_url() {
if (isset($_GET['action']) && $_GET['action'] === CUSTOM_ADMIN_URL) {
// Erlaubt den Login über die custom URL
return;
}
// Block standard wp-login.php
if (strpos($_SERVER['REQUEST_URI'], 'wp-login.php') !== false) {
if (!isset($_GET['action']) || $_GET['action'] !== CUSTOM_ADMIN_URL) {
wp_redirect(home_url());
exit;
}
}
}
// Leite wp-login.php auf custom URL um
add_filter('login_url', 'custom_login_page_url', 10, 3);
function custom_login_page_url($login_url, $redirect, $force_reauth) {
$login_url = home_url('/' . CUSTOM_ADMIN_URL . '/');
if (!empty($redirect)) {
$login_url = add_query_arg('redirect_to', urlencode($redirect), $login_url);
}
if ($force_reauth) {
$login_url = add_query_arg('reauth', '1', $login_url);
}
return $login_url;
}
So funktioniert's
- Custom URL definieren: Ändere
'geheim-admin'auf deine gewünschte URL - Neue Login-URL: Statt
/wp-adminnutzt du jetzthttps://deine-website.de/geheim-admin/ - Blockierung: Direkter Zugriff auf
/wp-adminund/wp-login.phpwird zur Startseite umgeleitet - AJAX-Ausnahme: Admin-AJAX funktioniert weiterhin (wichtig für Plugins!)
Alternative: Plugin-Lösung
Falls dir die Code-Lösung zu technisch ist, gibt es auch Plugins:
- WPS Hide Login (kostenlos, schlank, zuverlässig)
- iThemes Security (umfangreiches Security-Plugin mit Login-URL-Feature)
Meine Empfehlung: Code-Snippet in der functions.php ist performanter als ein Plugin und gibt dir volle Kontrolle.
2. Kommentare komplett deaktivieren
Wenn du keine Kommentare auf deiner Website brauchst, solltest du sie komplett deaktivieren. Ungenutzte Kommentarfunktionen sind Angriffsflächen für:
- Spam-Bots
- XSS-Attacken
- SQL-Injection
- Phishing-Links
Der Codeschnipsel
Füge folgenden Code in deine functions.php ein:
<?php
/**
* WordPress Kommentare komplett deaktivieren
*
* Entfernt Kommentare aus Admin, Frontend und Datenbank-Queries
*/
// 1. Kommentare & Trackbacks für alle Post-Types deaktivieren
add_action('admin_init', 'disable_comments_post_types_support');
function disable_comments_post_types_support() {
$post_types = get_post_types();
foreach ($post_types as $post_type) {
if (post_type_supports($post_type, 'comments')) {
remove_post_type_support($post_type, 'comments');
remove_post_type_support($post_type, 'trackbacks');
}
}
}
// 2. Schließe Kommentare für bestehende Posts
add_filter('comments_open', '__return_false', 20, 2);
add_filter('pings_open', '__return_false', 20, 2);
// 3. Verstecke Kommentare im Admin-Menü
add_action('admin_menu', 'disable_comments_admin_menu');
function disable_comments_admin_menu() {
remove_menu_page('edit-comments.php');
}
// 4. Entferne Kommentare aus der Admin-Bar
add_action('init', 'disable_comments_admin_bar');
function disable_comments_admin_bar() {
if (is_admin_bar_showing()) {
remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);
}
}
// 5. Redirect von Kommentar-Seiten im Admin
add_action('admin_init', 'disable_comments_admin_redirect');
function disable_comments_admin_redirect() {
global $pagenow;
if ($pagenow === 'edit-comments.php' || $pagenow === 'options-discussion.php') {
wp_redirect(admin_url());
exit;
}
}
// 6. Entferne Kommentar-Support aus Dashboard-Widgets
add_action('wp_dashboard_setup', 'disable_comments_dashboard');
function disable_comments_dashboard() {
remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal');
}
// 7. Entferne Kommentare aus RSS-Feeds
add_filter('comment_feed_links', '__return_empty_array');
// 8. Entferne Kommentar-Anzahl aus Admin-Columns
add_filter('manage_posts_columns', 'disable_comments_columns');
add_filter('manage_pages_columns', 'disable_comments_columns');
function disable_comments_columns($columns) {
unset($columns['comments']);
return $columns;
}
// 9. Blockiere Kommentar-Formulare im Frontend (falls Theme hardcoded)
add_filter('comments_template', 'disable_comments_template', 20);
function disable_comments_template() {
return dirname(__FILE__) . '/comments-disabled.php';
}
// 10. Entferne Kommentar-Reply-Script (Performance-Boost!)
add_action('wp_enqueue_scripts', 'disable_comments_reply_script');
function disable_comments_reply_script() {
wp_deregister_script('comment-reply');
}
Erstelle zusätzlich eine leere Template-Datei
Erstelle im gleichen Verzeichnis wie deine functions.php eine Datei comments-disabled.php:
<?php
/**
* Leeres Kommentar-Template
*
* Verhindert Anzeige von Kommentar-Formularen im Frontend
*/
// Nichts ausgeben - Kommentare sind deaktiviert
return;
Was dieser Code bewirkt
- Admin-Interface: Entfernt Kommentar-Menü und Widgets
- Frontend: Blockiert Kommentar-Formulare komplett
- Datenbank: Verhindert neue Kommentare
- Performance: Entfernt unnötige Scripts (comment-reply.js)
- RSS-Feeds: Keine Kommentar-Feeds mehr
- Dashboard: Keine Kommentar-Statistiken
Bestehende Kommentare löschen (Optional)
Falls du bereits Kommentare in der Datenbank hast:
-- VORSICHT: Backup erstellen vor Ausführung!
-- Löscht ALLE Kommentare unwiderruflich
-- In phpMyAdmin oder via WP-CLI ausführen:
DELETE FROM wp_comments;
DELETE FROM wp_commentmeta;
Oder via WP-CLI (sicherer):
wp comment delete $(wp comment list --format=ids) --force
3. Bonus: Weitere Sicherheits-Tipps
.htaccess-Schutz für wp-config.php
# wp-config.php schützen
<files wp-config.php>
order allow,deny
deny from all
</files>
Login-Versuche limitieren (Code-Snippet)
<?php
/**
* Login-Versuche limitieren (einfache Variante)
*/
add_action('wp_login_failed', 'login_failed_limit');
function login_failed_limit($username) {
$ip = $_SERVER['REMOTE_ADDR'];
$key = 'login_attempts_' . md5($ip);
$attempts = get_transient($key) ?: 0;
$attempts++;
set_transient($key, $attempts, 15 * MINUTE_IN_SECONDS);
if ($attempts >= 5) {
wp_die('Zu viele fehlgeschlagene Login-Versuche. Bitte warten Sie 15 Minuten.');
}
}
XML-RPC deaktivieren (DDoS-Prävention)
<?php
// XML-RPC komplett deaktivieren
add_filter('xmlrpc_enabled', '__return_false');
// Oder in .htaccess:
// <Files xmlrpc.php>
// order deny,allow
// deny from all
// </Files>
Checkliste: WordPress-Sicherheit
- Admin-URL geändert (siehe Code oben)
- Kommentare deaktiviert (falls nicht benötigt)
- WordPress, Themes & Plugins aktuell halten
- Starke Passwörter nutzen (min. 16 Zeichen)
- 2-Faktor-Authentifizierung aktivieren
- SSL/HTTPS aktiviert
- Regelmäßige Backups
- Security-Plugin installieren (z.B. Wordfence, iThemes Security)
- File-Permissions korrekt setzen (644 für Dateien, 755 für Ordner)
- wp-config.php in .htaccess schützen
- XML-RPC deaktivieren
- Standard-Admin-User "admin" umbenennen
Performance-Tipp: functions.php auslagern
Bei vielen Code-Snippets wird die functions.php schnell unübersichtlich. Mein Tipp:
<?php
// In functions.php
require_once get_template_directory() . '/inc/security.php';
require_once get_template_directory() . '/inc/comments.php';
Erstelle einen /inc/-Ordner im Theme und lagere die Snippets in separate Dateien aus:
security.php- Alle Security-Funktionencomments.php- Kommentar-Deaktivierungperformance.php- Performance-Optimierungen
Fazit: Weniger Code, mehr Sicherheit
Mit diesen beiden Code-Snippets hast du zwei der häufigsten Angriffsvektoren eliminiert:
- Admin-URL ändern: Reduziert Brute-Force-Versuche um 90%+
- Kommentare deaktivieren: Null Spam, null XSS-Risiko
Wichtig: Security by Obscurity (Admin-URL ändern) ist keine alleinige Lösung, sondern Teil einer mehrschichtigen Sicherheitsstrategie. Kombiniere diese Maßnahmen mit:
- Regelmäßigen Updates
- Starken Passwörtern
- 2FA
- Security-Plugin
- Regelmäßigen Backups
Weitere Ressourcen
Hast du Fragen zu den Code-Snippets oder weitere Sicherheits-Themen, die ich behandeln soll? Schreib mir gerne!
Hinweis: Teste alle Code-Änderungen zuerst auf einer Staging-Umgebung. Erstelle vor jeder Änderung an der functions.php ein Backup deiner Website!
