Webhook für Uberblogr

Hä? Kryptisch? Das kläre ich gleich auf…

Mein Blog ist seit einigen Wochen Mitglied im Uberblogr Webring von Thomas Gigold. Unten am Ende jedes meiner Blogbeiträge wie auch auf der Startseite findet ihr die Links, die zu den UberBlogr-Mitgliedern führen. Webring-gemäß könnt ihr einfach das nächste (oder vorige) Blog im Ring anwählen oder über meinen Blogeintrag dort starten.

Ich bin zu der Auffassung gelangt, dass es Bedarf für solche auf den ersten Blick etwas veralteten Vernetzungsformen Webseiten gibt. Web-Ringe gibt es schon länger als Blogs, schon in den mittleren Neunzigerjahren haben sich auf diese Weise private Website-Betreiber untereinander verlinkt und somit vernetzt.

Heute gelangen Blogs offenkundig wieder zu mehr Aufmerksamkeit, viele – zu denen ich mich ganz klar zähle – sehen ihre Blogs als eindeutig bessere Möglichkeit, inhaltlich im WorldWideWeb etwas beizutragen und zu diskutieren, als es die sogenannten »Sozialen Netzwerke« leisten können.

Es gibt seit einigen Wochen eine interessante Diskussion hierzu – die Initiative #SoSollWeb, zu der ich auch schon beigetragen habe.

Heute und hier soll es aber nur kurz um einen technischen Beitrag gehen, wie sich die Möglichkeit der Vernetzung in einem Web-Ring mit WordPress gestalten lässt. Das ist nämlich nur vordergründig ganz einfach. Und unproblematisch.

WordPress und das sichere »Pingen«

Bei WordPress ist für das »Anpingen« anderer Seiten und Dienste die sogenannte XMLRPC-Schnittstelle zuständig, realisiert in der Datei xmlrpc.php im Hauptverzeichnis einer WP-Installation.

Im Lauf der Jahre habe ich erfahren, dass das nicht ganz unproblematisch ist – um es gelinde auszudrücken!

Dazu ein kurzer Blick zurück:

Irgendwann in den späteren Zehnerjahren stellte ich fest, dass fast täglich Hunderte Zugriffsversuche auf mein Blog in den Logdateien verzeichnet sind. Nun hatte ich damals schon sowohl komplexe Benutzernamen, die von außen nicht »sichtbar« bzw. auslesbar sind, als auch komplexe Passwörter, die auch nach heutigen Ansprüchen als ausgesprochen sicher gelten dürfen. Beides zusammen – Benutzernamen und Passwörter – dürften sich als Kombination in keiner noch so umfangreichen Combo-Liste für Brute-Force-Attacken wiederfinden. Von daher machte ich mir keine Sorgen, dass mit Hilfe solcher Attacken jemand Zugriff auf den Adminbereich meines Blogs erlangen könnte.

Jedoch bleibt immer ein Risiko übrig. Was aber bedeutsamer war, ist der Umstand, dass solche Massenattacken einen ganzen Haufen Serverlast darstellen. Und das muss nicht sein.

Also setzte ich ein Plugin ein, dass Zugriffsversuche über die Login-Schranke von WordPress nach z.B. drei Fehlversuchen für eine einstellbare Zeit blockiert. Also etwa: 3 Fehlversuche, daraufhin 10 Minuten Zwangspause. Das sollte Brute-Force-attackierende Skripte blockieren… dachte ich. Immerhin wurde ein solches Plugin als höchst hilfreich beschrieben.

Tatsächlich hatte das Plugin keinerlei Einfluss auf die Zahl und Häufigkeit der Attacken. Obwohl es funktionierte!

Ich begann im Netz zu forschen und stieß schon nach kurzer Zeit auf den Kern des Problems – dabei lernte ich die sehr umtriebigen Bestrebungen von Mike Kuketz kennen, für mehr Sicherheit im Netz und auf unseren PCs und Mobilgeräten zu sorgen.

Mike beschäftigt sich in einem ausführlicheren Artikel von 2015 (!) mit der grundlegenden Problematik der XMLRPC-Schnittstelle, wie sie eben auch bei WordPress zum Einsatz kommt.

Und genau hier lag mein Problem:

Die Brute-Force-Attacken verlaufen überhaupt nicht über die normale Login-Schnittstelle von WordPress, sondern als äußerst effektive Massenattacken über XMLRPC! Und das lässt sich nur unterbinden, indem man diese Schnittstelle außer Betrieb setzt.

Mike Kuketz erläutert in seinem Artikel, wie man das machen kann – und genau das habe ich getan. Das Lustige war, dass zu genau dem Zeitpunkt an einem Abend, an dem ich die Maßnahmen implementierte, die Attacken aufhörten. Ich konnte das praktisch auf die Sekunde genau im Logfile nachvollziehen.

Aber: der Nachteil

Ohne XMLRPC-Schnittstelle kein »Pingen« mehr in WordPress. Auch kein Trackback mehr. Damit konnte ich leben. Aber: heute kein UberBlogr-Webring via »Ping«. Oder doch?

Thomas Gigold weist auf zwei andere Möglichkeiten hin. Eine aktiv vom Blog aus, eine passiv vom Webring aus. Die passive Möglichkeit liest einfach täglich ein paar Mal den RSS-Feed des teilnehmenden Blogs ein und ermittelt so neue Beiträge.

Die Lösung

Die aktive Möglichkeit funktioniert über einen »Webhook«, der als Skript-Block in die Theme-eigene functions-php eingebaut wird und den Ziel-Link der zu benachrichtigenden Seite enthält. Die functions.php ist insofern abgesichert, als sie von außen nicht aufgerufen werden kann.

Der Webhook-Skriptblock packt, soweit ich es im Code verstehe, ein JSON-Datenpäckchen des aktuellen Artikels zusammen (ID, Titel, URL, Kategorie, Exzerpt und Thumbnail) und sendet es per POST-Request an die Zieladresse. Dort liest ein implementiertes Gegenstück dieses Päckchen aus und stellt den passenden Link zum Artikel in der Liste der aktualisierten Blogs zusammen.

So weit die Theorie – ich habe das soeben in meinem Blog eingebaut und werde nun genau diesen Artikel hier veröffentlichen. Und dann werde ich hoffentlich im UberBlogr-Webring den aktuellen Eintrag zu diesem Beitrag finden…

Ich bin mal sehr gespannt, ob das funktioniert.

Stay tuned…

Wie’s aussieht, hat’s funktioniert!

Kommentare

Eine Antwort zu „Webhook für Uberblogr“

  1. Die XML RPC Schwachstelle in WordPress kenne ich, aber es ist eben auf der anderen Seite die verbreiteste.

    Hast du im Backend noch immer die UberBlogr-URL im „Einstellung > Schreiben“ Menü? Ich hab‘ mal im Log geschaut & bekomme eigentlich immer RPC Pings von dir, keine per Webhook?

    Der Webhook an UberBlogr braucht eigentlich nur einen Parameter ‚url‘ über den du https://blog.tld mitgibst (wie bei der Anmeldung hinterlegt); auf den Rest verzichtet er.

    Schreib mir gern per Mail, dann können wir es im Detail klären.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert