toscho.design

Log-In-Versuche blockieren

Auf einigen meiner Websites ist die Zahl der bösartigen Anmeldeversuche pro Tag höher als alle normalen Zugriffe zusammen. Das ist eigentlich nicht schlimm, aber es stört mich, Ressourcen an Arschlöcher zu vergeuden.

.htaccess to the rescue!

Loggen

Zunächst einmal habe ich T5 Unique Log-in Field installiert, genauer gesagt: den noch nicht öffentlichen Nachfolger. Dieses Plugin baut in das Anmeldeformular eine zusätzliche Checkbox per JavaScript ein. Ist diese nicht gesetzt, kommt man nicht rein, selbst wenn Name und Passwort stimmen. Das senkt schon einmal die Gefahr des richtigen Ratens, denn die meisten Anmeldeversuche laufen über Scripte, die nur die Standardwerte senden.

Wenn so ein Versuch fehlschlägt, bekomme ich eine E-Mail mit den IP-Adressen aus HTTP_X_FORWARDED_FOR, REMOTE_ADDR und HTTP_CLIENT_IP zugeschickt. Außerdem den Anmeldenamen, denn ich will keine richtigen Nutzer sperren, die nur vergessen haben, die Box anzuhaken.

Wenn die Box angehakt ist und der Versuch trotzdem fehlschlägt, bekomme ich auch eine Email mit den gleichen Daten.

Sperren

Diese IP-Adressen kontrolliere ich zunächst, und dann sperre ich sie, wenn ich keine Nebeneffekte befürchte.

Ich habe mir auch andere Header angesehen, insbesondere den Referer. Viele Scripte senden keinen Referer oder einen, der nicht mit der echten Adresse der wp-login.php übereinstimmt. Die erwischt man mit einem weiteren Eintrag in der .htaccess:

# Deny access with invalid or missing referer on log-in attempts
RewriteCond %{REQUEST_METHOD} POST
# See http://tltech.com/info/referrer-htaccess/
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/wp-login\.php
RewriteRule wp-login\.php - [L,R=403]

Das Ergebnis kann man in der .htaccess für wpkrauts.com ansehen. Auf den ersten Blick ist es recht viel, aber doch weniger als ich erwartet habe. Auf jeden Fall wird das schneller abgearbeitet als WordPress, das beim Einsatz von Plugins wie Limit Login Attempts oder Ähnlichem geladen werden müsste.

Auf wpkrauts.com, das von den Anmeldeversuchen besonders schlimm betroffen war, habe ich so die Zugriffe von rund 1000 auf 1 bis 3 pro Tag gesenkt.

Sparen

Schließlich habe ich auch den Overhead für das Senden der 403-Statusheader reduziert. Die Direktive ErrorDocument akzeptiert nämlich auch einen String als Wert. Der wird dann statt des normalen HTML-Dokuments gesendet. Also nochmal in die .htaccess:

# Replace the default HTML file with a simple string
ErrorDocument 403 "no"

Mehr zum Thema

2 Kommentare

  1. Axel Schiedeck am 21.09.2014 · 02:37

    Hallo, tolles Script.
    Aber wo baue ich die Mail-Adresse ein.
    Ich bin in PHP nicht so bewandert.
    Würde mich über eine Antwort freuen.

    VG

  2. Thomas Scholz am 21.09.2014 · 23:20

    @Axel Schiedeck: In dem Plugin gibt es keine Email-Adresse. Die Emails, die ich bekomme, laufen über ein zweites Script, in das sich die Login-Kontrolle einhängt.

    Du kannst genau über der Zeile, wo header( 'Location: http://localhost' ); steht wp_mail() einbauen. Etwa so:

    wp_mail(
    	get_option( 'admin_email'),
    	'Loginversuch auf ' . get_bloginfo(),
    	'IP: ' . $_SERVER['REMOTE_ADDR'] . "\nZeit: " . date( DATE_RFC822 )
    );