WordPress bietet eine Reihe von Informationen über das System:

XML-Seiten

finden sich Links auf spezielle XML-Seiten.

Recht gefährlich ist wohl die REST-API

Also, wenn ich eine Website angreifen möchte, dann würde ich doch im ersten Schritt gerne wissen, wie die Benutzer auf dem System heißen. Dann freue ich mich doch, wenn mir das System selber iese Informationen liefert http://<domain.de>/wp-json/wp/v2/users:

 

Hinweis: Die Informationen sind in dem Dateiformat json strukturiert . Firefox ist in der Lage, die Struktur zu nutzen, in Chromium-Browsern sieht die Information etwas unübersichtlicher aus.

[{"id":1,"name":"netthelp","url":"http:\/\/wordpress.netthelp.de","description":"","link":"http:\/\/wordpress.netthelp.de\/author\/netthelp\/","slug":"netthelp","avatar_urls":{"24":"http:\/\/0.gravatar.com\/avatar\/3f9d5473bdbd0ade2f77475a42dfaa05?s=24&d=mm&r=g","48":"http:\/\/0.gravatar.com\/avatar\/3f9d5473bdbd0ade2f77475a42dfaa05?s=48&d=mm&r=g","96":"http:\/\/0.gravatar.com\/avatar\/3f9d5473bdbd0ade2f77475a42dfaa05?s=96&d=mm&r=g"},"meta":[],"_links":{"self":[{"href":"http:\/\/wordpress.netthelp.de\/wp-json\/wp\/v2\/users\/1"}],"collection":[{"href":"http:\/\/wordpress.netthelp.de\/wp-json\/wp\/v2\/users"}]}}]

Es bietet sich also an hier den Firefox-Browser zu nutzen oder ein passendes Plugin von https://chromewebstore.google.com/search/json zu installieren.

Die Seite /wp-json/wp/v2/users/ ist übrigens nur eine von vielen Unterseiten, eine Übersicht bekommt man mit http://<domain.de>/wp-json/wp/v2/

Für diese Seite werde ich nur Screenshots von dem Netthelp WordPress darstellen, live können wir uns beliebige Seiten dazu anschauen.

Eine Übersicht über die API-funktionen kann man auf der Seite https://developer.wordpress.com/docs/api/ bekommen.

 

REST API deaktivieren

Es ist also wichtig, diese Funktionalität nach außen zu deaktivieren. Ganz deaktivieren kann man diese API nicht, dann würden viele Komponenten nicht mehr funktionieren, u.a. auch der Gutenberg Editor.
Im Web findet sich eine Reihe von Anleitungen für unterschiedlichst Wege zur Deaktivierung:

Auf https://seoagentur-hamburg.com/wordpress-rest-api-deaktivieren/ wird empfohlen eine kleine Erweiterung der functions.php vorzunehmen:

<?php
/* Ab hier kopieren */
/**
* REST-API fuer extere User abschalten
*/
add_filter('rest_authentication_errors', function($result) {
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_API_cannot_access', array( 'status' => rest_authorization_required_code() ) );
}
return $result;
});

Auf diese Art bekommen nur angemeldete Nutzer Zugriff auf die API.

Auf https://www.netz-gaenger.de/blog/wordpress-tutorials/rest-api-in-wordpress-deaktivieren/ findet sich ein extremerer Vorschlag:

add_filter('rest_enabled', '_return_false');
add_filter('rest_jsonp_enabled', '_return_false');

Ich fürchte, dass damit auch intern die API deaktiviert ist.

Aber auf der Seite wird auch auf eine Lösung verwiesen, ähnlich der, die wir bei Netthelp nutzen, das Plugin https://wordpress.org/plugins/disable-json-api/

Bei Netthelp nutzen wir schon lange das Plugin https://wordpress.org/plugins/disable-wp-rest-api/

Mir ist mal wieder ein Problem aufgefallen, welches mit Google und seinem Regulationanspruch zusammen hängt. Es ist nämlich so, dass manche WP-Systeme keine Mails an Google-Empfänger verschicken können. Man bekommt dann in der Logdateie eine Fehlermeldung wie:

<ein-user@gmail.com>: host gmail-smtp-in.l.google.com[142.251.175.26] said:
550-5.7.26 This mail is unauthenticated, which poses a security risk to the
550-5.7.26 sender and Gmail users, and has been blocked. The sender must
550-5.7.26 authenticate with at least one of SPF or DKIM. For this message,
550-5.7.26 DKIM checks did not pass and SPF check for
[h2412yxyz.stratoserver.ne 550-5.7.26 t] did not pass with ip:
[85.214.x.y]. The sender should visit 550-5.7.26
https://support.google.com/mail/answer/81126#authentication for 550 5.7.26
instructions on setting up authentication.
s24-20020a632158000000b0055acc7f8088si4258738pgm.301 - gsmtp (in reply to
end of DATA command)

Das hat schon eine gewisse Berechtigung, weil das WordPress-System hier keine sinnvolle Absenderadresse gesetzt hat, sondern www-data als Absender genommen hat. Das ergänzt das Mailsystem dann noch um den Servernamen. Damit schlagen dann die genannten Checks fehl.

Zur Beseitigung des Problems gibt es mehrere Möglichkeiten:

  1. Nutzung eines Plugins wie WP Mail SMTP/ 
  2. Anpassung der functions.php

Das vielgelobte Plugin hat mich genervet, weil es gleich eine Pro-Version anbietet. Ich habe also unter Design -> Theme-Datei-Editor die Datei functions.php (Theme-funktionen) um die folgenden Zeilen erweitert (einfach angehängt):

// Mail Hook mail_from
add_filter( 'wp_mail_from', function ( $original_email_address ) {
return 'testpress@meine-domain.de';
} );

// Mail Hook mail_from_name
add_filter( 'wp_mail_from_name', function ( $original_email_from ) {
return 'Testpress';
} );

//Action Hook phpmailer_init
add_action( 'phpmailer_init', 'my_phpmailer_init' );
function my_phpmailer_init( $phpmailer ) {
$phpmailer->Sender = $phpmailer->From;
}

Die beiden Mail-Hooks setzten die Absender-Adresse auf einen gewünschten Wert, wobei der Hook eigentlich eine funcion einbindet, die hier jeweils gleich integriert ist. In vielen Beschreibungen ist das auch getrennt (https://wordpress.org/support/topic/change-sender-name-and-email-address-wordpress/) .
Diese Einstellungen reichen aber nicht aus, weil damit die Adresse im Envelope (Umschlag) nicht geändert wird und das ist die entscheidende Stelle. Dafür gibt es einen Action-Hook, über den man die Initialisierung des Mailers vornehmen kann. Hier ändern wir nur den Wert für Sender und zwar auf den gerade davor gesetzten Wert von From.

Auch wenn innerhalb der WordPress Options, eventuelle durch eine Erweiterung,  eine Mailadresse gesetzt ist, wie z.B. wpmembers_email_wpfrom, so wird die erst durch die se Initialisierung aktiv.

Damit sollten jetzt auch Mails an z.B. Google-Adressen funktionieren, sofern der eingestellte Absender grundsätzlich entsprechende Mails verschicken kann.

Damit die Änderung nicht bei nächsten Update des Themes überschieben wird, sollte man ein Child-Theme anlegen, in dem diese Ergänzung realisiert wird.

Weitere Informationen:

https://developer.wordpress.org/reference/hooks/wp_mail_from/
https://developer.wordpress.org/reference/hooks/wp_mail_from_name/
https://developer.wordpress.org/reference/hooks/phpmailer_init/

 

WordPress benutzt etwas wie einen indirekten Cron-Job. Bei jedem Seitenaufruf durch einen Benutzer wird nachgeschaut, ob etwas zu tun ist und dann ggf. die Seite http://<meine Domain>/wp-cron.php auf. Was dabei irritierend wirkt ist die Tatsache, dass dabei die Serveradresse als aufrufende Adresse in den Logdateien auftaucht.

Man kann aber auf richtige Cron-Jobs umstellen. Dazu fügt man folgende Zeile in die wp-config.php ein:

define(‚DISABLE_WP_CRON‘, ‚true‘);

und zwar möglichst am Ende direkt vor der Zeile

/* That’s all, stop editing! Happy blogging. */

Dann muss man noch einen Cronjob erstellen nach dem Muster:

-2,32   *       *       *       *    cd /<pfad zu WordPress>/wordpress; php -q wp-cron.php

Nachdem Ghostery nun in meinem Firefox alle kommerziellen Webwanzen blockt habe ich begonnen selber mit Webwanzen zu experimentieren. Dafür gibt es das Programm Piwik, das man auf einem eigenen Server installieren und dann in die eigenen Seiten einbinden kann. Damit bekommt man ausführliche Hinweise über die Nutzung der Seiten, ohne Daten aus der Hand zu geben. Alles läuft auf eigenen Rechnern.

In die Webseiten, die ausgewertet werden sollen, muss man nur folgenden Code integrieren (und natürlich anpassen):

<!-- Piwik -->
 <script type="text/javascript">
 var pkBaseURL = (("https:" == document.location.protocol) ? "https://mein-server.de/piwik/" : "http://mein-server.de/piwik/");
 document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
 </script><script type="text/javascript">
 try {
 var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", 2);
 piwikTracker.trackPageView();
 piwikTracker.enableLinkTracking();
 } catch( err ) {}
 </script><noscript><p><img  src="http://mein-server.de/piwik/piwik.php?idsite=2" style="border:0"  alt="" /></p></noscript>
 <!-- End Piwik Tag -->

Für die Integration in Content Management Systeme findet sich unter http://piwik.org/faq/plugins/ eine Reihe von Plugins. Leider ist deren Nutzung nicht immer unproblematisch.

Für die Mediawiki-Integration findet sich unter http://www.mediawiki.org/wiki/Extension:Piwik_Integration eine passende Software. Man muss nur beim Download aufpassen. Hier wird man nach der benutzten Mediawiki-Version gefragt. Wählt man hier z.B. wahrheitsgemäß 1.15.x so bekommt man eine alte, bei mir nicht funktionsfähige Version. Man sollte hier als Mediawiki-Version unbedingt Development version (trunk) auswählen. Dann lädt man momentan die funktionsfähige Version Piwik-trunk-r72455.tar.gz .

Auch bei WordPress ist die Integration nicht unbedingt problemlos. Das Plugin Piwik Analytics ist über die Plugin-Verwaltung zu installieren und vermutlich auch funktionsfähig. Ich benutze aber momentan ein Template, bei dem in der Footer-Datei der Aufruf von wp_footer() fehlt. In diese Funktion klingt sich das Plugin wohl ein. Da in der footer.php zu meinem Template nur HTML-Code steht habe ich den Piwik-Code hier direkt eingebunden, damit funktioniert Piwik auch hier, zumindest solange ich das Template nicht wechsle.

Für Typo3 gibt es unter http://typo3.org/extensions/repository/view/piwik/current/ ebenfalls eine passend Extension. Diese muss ich noch ausprobieren. Bisher habe ich den Piwik-Code einfach mit in das Root-Template aufgenommen:

page.headerData.199 = TEXT
page.headerData.199.value (
 <!-- Piwik -->
 <script type="text/javascript">
 var pkBaseURL = (("https:" == document.location.protocol) ? "https://mein-server.de/piwik/" : "http://mein-server.de/piwik/");
 document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
 </script><script type="text/javascript">
 try {
 var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", 1);
 piwikTracker.trackPageView();
 piwikTracker.enableLinkTracking();
 } catch( err ) {}
 </script><noscript><p><img src="http://mein-server.de/piwik/piwik.php?idsite=1" style="border:0" alt="" /></p></noscript>
 <!-- End Piwik Tag -->
)

Damit erscheint der Code im Header-Bereich der Seite und nicht wie in der Anleitung beschrieben am Ende des Body-Bereiches, aber auch das funktioniert bisher.

Inzwischen habe ich auch die Extension piwiki aus dem Typo3-Repository ausprobiert und zwar in der Version 2.0.0. Die Extension muss nur installiert und aktiviert werden, dann folgen noch vier Zeilen im Root-Template:

config.tx_piwik {
  piwik_idsite = 1
  piwik_host   = http://mein-server.de/piwik/
}

Entgegen der Beschreibung muss hier wirklich http:// mit angegeben werden, sonst entstehen relative Verweise. Bevor man die Installation testen kann, muss man sich unbedingt vom Backend abmelden. Solange man im Backend angemeldet ist erfolgt nämlich keine Integration des Piwik-Codes.

Weitere Informationen zur Integration von Piwik in Typo3 finden sich bei Mittwald.