Absolute Sicherheit ist eine Illusion

100%-ige Sicherheit wird es am Computer nie geben. Sei es der Laptop zu Hause, das Smartphone oder der Webserver auf dem die eigene Website liegt.

Wordpress SicherheitInternet-Sicherheit gegen Hackerangriffe

Gerade populäre und weit verbreitete Software wie Windows oder WordPress ist anfällig für Hackerangriffe. Nicht weil sie schlechter wäre, sondern weil es doch durchaus mehr Sinn ergibt mit einer Schadsoftware sehr viele potentielle Ziele zu erreichen.

Für WordPress (wie für Betriebssysteme) gilt, regelmäßige Updates machen das System stabiler, sicherer und in der Regel anwenderfreundlicher. Gleiches gilt für die verwendeten Plugins.

Oft liegt es aber nicht an der Software. Das schwächste Glied in der Sicherheitskette ist manchmal der Nutzer selbst. Wenn meine WordPress-ID Franz (oder wie auch immer) und mein Passwort ebenfalls Franz lautet, ist es für einen Brute-Force-Angriff in der Regel nicht schwer einzudringen und das System zu infizieren. Also um ein Mindestmaß an Sicherheit zu gewährleisten am besten sichere Passwörter wählen, die Groß- und Kleinbuchstaben, Ziffern und Sonderzeichen wie Tilde, Klammeraffe, Prozent o. dgl. enthalten.

Während früher Systeme durch Schadsoftware oft zum Absturz gebracht oder Daten gelöscht wurden, ist es heute wohl zielführender Software (oder Codezeilen) zu installieren, die unbemerkt Spam-Mails verschicken oder Links zu dubiosen Seiten setzen, um im Suchmaschinen-Ranking nach vorne zu kommen (Black-Hat-SEO-Spam). Weiterlesen

Geschwindigkeit in WordPress mit W3 Total Cache

W3 steht zwar nicht unbedingt für Warp Geschwindigkeit, aber eine WordPress-Installation um den Faktor 3 zu beschleunigen ist schon möglich. Eine schnelle Website wird in einer schnelllebigen Zeit immer wichtiger, wenn man nur einen Mausklick oder Fingertip von der nächsten (womöglich schnelleren) Seite entfernt ist.

Geschwindigkeit durch WordPress PluginDadurch, dass die Seite nicht jedesmal neu am Webserver "zusammengebaut" werden muss, sondern fix fertig aus dem Cache kommt, ist die Zeit für das sogenannte First Byte natürlich wesentlich und spürbar kürzer. Da macht das Surfen dann auch wieder Spaß, wenn auch die Gesamtladezeit der Seite nicht durch das Caching verkürzt wird. Es müssen immerhin noch genau so viele Bytes vom Server übertragen werden.

Was aber die Geschwindigkeit erhöht ist das sogenannte Minify, bei dem Leerzeichen, Tabulatoren, Absätze u. dgl. aus dem Quelltext von HTML-, CSS- und Javascript-Dateien entfernt wird.

Geschwindigkeit für Kundenwebsite

Für ein Kundenprojekt habe ich mal die Vorher-Nachher-Werte protokoliert und der Unterschied ist gewaltig. Nicht nur, dass die Seite gefühlt wesentlich schneller ist, der Geschwindigkeitsvorteil macht sich auch bei der Bewertung du Googles PageSpeed Insight deutlich bemerkbar. Die Tools zur Geschwindigkeitsmessung sind auf einer eigenen Seite beschrieben.

Also zunächst das Plugin installieren und dann aktivieren und zu den Einstellungen wechseln. Die sind in der Auswahlleiste ganz links unter Performance zu finden.

Das hat sich bislang bewährt (nur die Änderung zur Standardeinstellung sind angeführt):

General Settings

  • Page Cache Enable
  • Minify Enable, Minify Mode Manual (Auto bringt eine Fehlermeldung auf meinem Server)
  • Database Cache Enable
    Wenn Woocommerce verwendet wird _wc_session_ unter Database Cache Ingnored Query Strings hinzufügen
  • Object Cache Enable
  • Browser Cache Enable

Minify

Wird das Sucuri Security Plugin verwendet, muss die now.php von W§ Total Cache im Plugins-Verzeichnis (wp-content) auf die Whitelist Blockes PHP Files gesetzt werden.

  • Disable minify for logged in users ... sonst wird das Debugging schwierig (optional)
  • Minify error notification: Admin Notification kann hier nützlich sein
  • HTML minify settings: Enable, Inline CSS minification, Inline JS minification, Line break removal
  • JS minify settings: Enable, Embed type: Non-blocking using "async", Preserved comment removal, Line break removal

    Wenn MinifyMode Manual dann müssen hier alle Javascripts eingetragen werden. Die jqery.js, die Javascripts von

    • Awsome Responsive Menu,
    • Background Manager,
    • T(-) Countdown und
    • Wp Lightbox Bank Plugin

      können z. Zt. nicht erfolgreich minified (bzw. in den Fußbereich der Seite gestellt) werden. Um zumindest die Dateigröße zu vermindern, kann der Inhalt der Dateien manuell verkleinert werden. Ein Online-Tool hierzu findet sich unter Online Javascript Compression Tool.

      Die JS's von Visual Form Builder und MapPress Easy Google Maps Plugin scheinen dankenswerterweise nur auf Seiten auf, auf denen es auch Formulare gibt.

  • CSS minify settings: Enable, Preserved comment removal,  Line break removal, @import handling: Process.

    Auch hier müssen im manuellen Minify Modus die CSS-Dateien eingetragen werden.

    Mit <!-- W3TC-include-css --> kann man die zusammengefassten CSS in der footer.php ans Ende stellen (vor </body>). Analog dazu gibt es auch einen Tag für JavaScript: <!-- W3TC-include-js-head -->

Database Cache

  • Wenn Woocommerce verwendet wird _wc_session_ unter Database Cache Ignored

Browser Cache

General

  • Set expires header
  • Set cache control header
  • Set entity tag (eTag)

Install

  • WordPress SEO by Yoast Extension aktivieren falls WordPress SEO verwendet wird

Suchmaschinenoptimierung ...

... schnell, schneller am schnellsten zur Suchmaschinenoptimierung

Suchmaschinenoptimierung leicht gemachtDie Geschwindigkeit einer Seite wird offenbar zum Thema beim Suchmaschinen-Ranking und somit zur Suchmaschinenoptimierung. Warum? Ganz einfach, kein Besucher mag 4 Sekunden auf den Seitenaufbau einer Seite warten, wenn schnellere Seiten nur einen Mausklick entfernt sind.

PageSpeed Insights

PageSpeed Insights liefert Ranking und Tipps für die Mobil- und die Desktopversion einer Seite. Ab einem Ranking von 85 ist man im grünen Bereich.

Es gibt auch ein Plugin für Chrome, dass dann PageSpeed als Reiter bei den Entwicklertools einfügt.

Test auf Optimierung für Mobilgeräte

Dieser Google Developers Test zeigt eine kurze Übersicht ob eine Site für Mobilgeräte optimiert ist. Allerdings ist das Ergebnis nicht so aufschlussreich wie unter PageSpeed Insights.

YSlow

YSlow gibt es als Plugin für viele Browser (nicht für den Internet Explorer)

GTmetrix

GTmetrix 

WebPagetest

WebPagetest 

Pingdom Tools

Pingdom 

Weiterlesen

Query Strings Remover

Googles PageSpeed InsightsDie Geschwindigkeit mit der eine Website abgerufen werden kann, ist offenbar mittlerweile Faktor für das Ranking von Suchmaschinen.

Google sagt dazu:

PageSpeed Insights analysiert eine Seite, um festzustellen, ob diese unseren Empfehlungen für das Rendering einer Seite in einem Mobilfunknetz in weniger als einer Sekunde entspricht. Studien haben gezeigt, dass bei einer Dauer von mehr als einer Sekunde der Gedankenfluss des Nutzers unterbrochen und das Nutzererlebnis dadurch beeinträchtigt wird. Unser Ziel ist es, dafür zu sorgen, dass der Nutzer sich kontinuierlich mit der Seite beschäftigt und unabhängig von Geräte- oder Netztyp ein optimales Erlebnis erhält.

Was spricht also dagegen den Empfehlungen von PageSpeed Insights und YSlow zu folgen?

Bringt es nichts im Ranking, so wird die Seite zumindest für den Besucher schneller.

Query Strings Remover entfernt dazu die Query-Strings von CSS uns JS Dateien, wodurch ein caching auf allen Servern ermöglicht wird.

Update: Query Strings Remover schafft es nicht alle Versionsinformationen zu entfernen. Deshalb wurden die Hooks script_loader_src und style_loader_src im PriMa-General-Plugin eingefügt um die Versionsinfo mit der Funktion remove_query_arg() zu entfernen,

Welche Plugins braucht man ...

Escape NextGen Gallery

Es gab Zeiten, in denen die NextGen Gallery eine echte Alternative zur Galeriefunktion von WordPress war. Das hat sich mittlerweile geändert.

Ältere Installationen, die dieses Plugin verwenden, können nicht ganz einfach auf die wordpresseigene Galerie umsteigen, weil die Bilder z. B. in einem eigenen gallery-Verzeichnis gespeichert werden.

Escape NextGen Gallery wandelt vorhandene Galerien um. Das funktioniert aber nur mit jeweils einem [nggallery] Shortcode pro Seite. Und wenn eine WordPress-Galerie und ein [nggallery] Shortcode auf einer Seite sind, werden mitunter Bilder aus der vorhandenen Wordpress-Galerie in die neu konvertierte übernommen. Nachdem aber das Rauslöschen der überzähligen Bilder schneller geht als die Fehlersuche, sollte man hier den pragmatischen Ansatz wählen.


Media Library Assistant

Media Library AssistantZugegeben, das Plugin kann echt viel und ich nutze vermutlich nur ganz wenig.

Eine Funktion, die sehr zeitsparend ist, nennt sich "IPTC/EXIF Mapping". Damit kann man JPG's bereits im Betriebssystem (Windows) mit einem Titel versehen und diesen anschließend automatisch in Titel, Alternativtext und Beschreibung der WordPress-Medien-Datei einfügen.

Weiters werden zusätzliche Filter und Suchfunktionen in die Mediathek eingebaut.

Mediathek ohne Media Library Assistant

Mediathek mit Media Library Assistant


 

qTranslate-X

Dies ist eine Weiterentwicklung von qTranslate, das aber zum heutigen Stand am 26.1.2014 zuletzt upgedated wurde. Nachdem zuletzt Probleme mit qTranslate aufgetreten sind, bin ich auf mqTranslate umgestiegen. Und nachdem das nicht mehr weiterenwickelt wird, bin ich jetzt bei qTranslate-X gelandet. Der Umstieg zwischen den Versionen verlief übrigens jeweils ohne Probleme.

Mit diesem Plugin können Seiten mehrsprachig gestaltet werden.


Resize Images before upload

Ist eigentlich schon selbsterklärend. Dafdurch können Fotos direkt vom Speichermedium raufgeladen werden, ohne, dass man befürchten muss, eine 5 MB Datei in die Seite einzubauen.


Sucuri Security

Mit diesem feinen Plugin kann einerseits geprüft werden, ob man sogenannten Brute-Force-Angriffen (Passwort erraten) ausgesetzt ist und andererseits die WordPressinstallation sicherer gemacht werden.

Siehe dazu auch die Artikel Sicherheit gegen Hackerangriffe bei WordPress und Das Salz in der Suppe für die WordPress-Sicherheit.


WP-Mail-SMTP

Sollte die standardmäßig am Server eingestellte Absendeadresse nicht den eigenen Vorstellungen entsprechen, kann dies mit diesem Plugin geändert werden.

Zudem kann ausgewählt werden, ob E-Mails mit SMTP oder der PHP mail()-Funktion gesendet werden.

Das Salz in der Suppe für die WordPress-Sicherheit

SalzstreuerIn (c) Dubravko SorićDamit man sich beim Bearbeiten der WordPress-Seiten nicht jedesmal neu einloggen muss, werden Cookies in den Speicher des Browsers gesetzt. Dadurch wird den aufrufenden Seiten signalisiert, der Benutzer ist eingeloggt und autorisiert.

Cookies sind also per se nichts Schlechtes.

In der Grundinstallation sind diese Cookies durch die Keys in der wp-config.wp nicht besonders gesichert, wie man am nachfolgenden Beispiel sehen kann:

define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');

Böse Buben (und auch Mädchen) könnten diese Cookies nutzen, um sich Zugriff auf die Website zu verschaffen.

Unter https://api.wordpress.org/secret-key/1.1/salt/ kann man sich diese Schlüssel generieren lassen und dann sieht es z. B. so aus:

define('AUTH_KEY', 'qtj-:G~p?UEy-;9*CJ+5Pj c:o|#@]`_JFc]D=K,*Wsco`o%{feE+ j}n,1|I3)#');
define('SECURE_AUTH_KEY', '0w<Lud7hXt&F>|=jp;1g6p*lAp-UB=d]GIn(;@]8yXVKW]NS|II/8/O.b6$?-w G');
define('LOGGED_IN_KEY', ',_?G%v@5@v}LH~ZF-,C`p|l5(q_?1@$i?^>Lz63O8 !eAQ_P{l$@:ueqcDzcVQPi');
define('NONCE_KEY', 'A>{UVihS*74x{:hU:1C{2<4/QOjAzZ-]kGu(q8KqKS{Rme~-:E|b1CZFM-+2|/NQ');
define('AUTH_SALT', 'K<y0JF,a-|/=KnJZ&i?N|,:3IR/cRbHK|.sCHQw&]OD1d|KX3Fp%;1Rq?+(IwK+}');
define('SECURE_AUTH_SALT', 'Y.PS1}yv-[&,Yl:y>B$+ttBj2PEwp~oJa4CSr!eswk(Db)}b$d|9$@TVj60|=9N4');
define('LOGGED_IN_SALT', '?T.5q`$+3X-_>SAq%==F-sc*>nNrx.2?|--iYvm/2zjMEKA^jN/s+dRbe1+:=s]:');
define('NONCE_SALT', 'jI(Uy;(W>UI$!)vOUOUvqI-/m[DTts*ZF+ BA6vznZY{;q=op<M10ffC|8~Os2Vf');

Diese Werte werden entweder manuell in die wp-config.php eingetragen oder man erledigt das automatisch z. B. mit dem Plugin Sucuri Security.

Salt (englisch für Salz) bezeichnet in der Kryptographie eine zufällig gewählte Zeichenfolge, die an einen gegebenen Klartext vor der Verwendung als Eingabe einer Hashfunktion angehängt wird, um die Entropie der Eingabe zu erhöhen. Es wird häufig für die Speicherung und Übermittlung von Computer-Passwörtern benutzt. Wikipedia

Mehr dazu im Artikel Sicherheit gegen Hackerangriffe bei WordPress

Aufruf einer WordPress-Seite über das Hauptverzeichnis

ProgrammcodeWird eine WordPress-Seite parallel zu einer bestehenden Site aufgebaut, kann es praktisch sein, das CMS in einem Unterverzeichnis zu installieren.

Ein Aufruf würde dann z. B. über http://www.meinedomain.at/wp/ oder http://www.meinedomain.at/wordpress/ oder so ähnlich.

Wenn die bisherige Site dann abgeschaltet wird, ist es natürlich einfacher und kürzer die Seiten über http://www.meinedomain.at zu erreichen.

Folgende Schritte sind dazu notwendig

Adminbereich => Einstellungen => Allgemein => WordPress-Adresse (URL): http://www.meinedomain.at/wordpress/

Da steht, wo WordPress seine Dateien wirklich findet und das bleibt so wie es ist.

Adminbereich => Einstellungen => Allgemein => Seiten-Adresse (URL): http://www.meinedomain.at/

Das steht wo es hingehen soll.

Wenn die beiden EIngabefelder ausgegraut sind und keine Eingabe möglich ist, wurden die Variablen WP_HOME und WP_SITEURL vermutlich in der wp-config.php gesetzt.

Es gibt aber noch einen Pferdefuß.

Die index.php und die .htaccess Dateien müssen ins Stammverzeichnis kopiert werden. Die .htaccess weil sonst mitunter mit Adminbereich => Einstellungen => Permalinks nicht funktioniert.

 

Und in der index.php muss der Pfad auf die wp-blog-header.php richtig gesetzt werden ... also  http://www.meinedomain.at/wordpress/wp-blog-header.php oder dgl.

 

Die Zeiten ändern sich ... in der Version 4.2.2 (oder auch schon früher) wurde die Zeile require( dirname( __FILE__ ) . '/wp-blog-header.php' ); verwendet. Dadurch wird schlauerweise immer im gleichen Verzeichnis in dem die index.php liegt gesucht.

Zum Schluss noch die Permalinks neu speichern unter:

Adminbereich => Einstellungen => Permalinks

Sicherheit gegen Hackerangriffe bei WordPress

Warum ist gerade meine Seite Ziel eines Hackerangriffs???

Don't Panic... nun, ich mag niemandes Illusion zerstören, aber es ist in den allermeisten Fällen eben nicht gerade meine Site, die angegriffen wird. WordPress behauptet auf der eigenen Website, dass es über 60 Millionen Nutzer dieses Content Management Systems gibt.

Und da liegt es nahe, dass die "bösen Buben" (vulgo Hacker) ein System wählen, dass möglichst großflächig angegriffen werden kann. Mittlerweile gibt es ja auch schon Hackerangriffe und Sicherheitslücken auf Apple Computer ... etwas, das bei Appleanhängern immer nur bei Windowsrechnern möglich schien ;-)

Wer also mit WordPress Ziel eines Hackerangriffs wird, ist in allerbester Gesellschaft.

Frei nach Douglas Adams gilt jedoch: Don't Panic!.

Das Plugin "Rename wp-login.php"

Damit gehen Brute-Force-Attacken ins Leere, weil es die Datei wp-login.php nicht mehr gibt. Ohne dieses Plugin sind pro Tag 40 Versuche und mehr das Passwort des admin Nutzers zu erraten keine Seltenheit.

wp-config.php etc. schützen

Es besteht in der Regel die Möglichkeit Dateien und Verzeichnisse serverseitig vor Zugriff zu schützen. Somit kann z.B. durch die Anweisung deny from all von außen (durch Eingabe des Dateinamens in der Browseradresszeile) nicht mehr auf die Datei wp-config.php zugegriffen werden.

<files wp-config.php>
order allow,deny
deny from all
</files>

Mit folgender Anweisung kann auch der Inhalt vom Upload- und Content-Ordner vor dem Ausführen von Dateien geschützt werden. Denkbar ist jedoch, dass zukünftige Plugins zugriff auf die PHP-Dateien brauchen. Bei Multisite-Installationen muss im wp-includes Ordner die ms-files.php Datei ausgenommen werden und das Sucuri Plugin nimmt wp-tinymce.php aus.

<Files *.php>
deny from all
</Files>

Standardbenutzer "admin" entfernen

Standardmäßig gibt es bei einer neuen WordPressinstallation den Benutzer admin.

Wenn dieser durch einen anderen Namen ersetzt wird (nicht vergessen die bereits erstellten Seiten und Beiträge einem bestehenden Benutzer zuzuordnen), muss bei Brute-Force-Attacken neben dem Passwort auch der Benutzername erraten werden.

Dateiberechtigungen

Verzeichnisse sollten die Berechtigung 755, Dateien die Berechtigung 644 haben. Bei manchen Plugins sind besondere Dateiberechtigungen notwendig.

Datenbank-Prefix verwenden

WordPress erlaubt die Verwendung eines Datenbank-Prefix. Diese freiwählbare Bezeichnung wird den Datenbanknamen vorangestellt, wodurch es schwieriger wird, auf die Datenbank selbst zuzugreifen (um z. B. einen eigenen Benutzer anzulegen).

Dateibearbeitung abschalten

Administratoren haben die Möglichkeit Plugin-Programmdateien im Plugin-Editor zu bearbeiten. Damit ist dem Unfug Tür und Tor geöffnet. Die Sicherheits-Plugins Wordfence (selbständige Abschaltung) und Sucuri Security (via Tab "Hardening") schalten diese Möglichkeit aus.

Alternativ kann folgende Zeile in die wp-config.php eingebaut werden:

define('DISALLOW_FILE_EDIT', true);

Key und Salt setzen

In der Grundinstallation verschlüsselt WordPress seine Cookies nicht. Mehr darüber im Artikel Das Salz in der Suppe für die WordPress-Sicherheit.

Informationen über die WordPress Version unterbinden

Wenn der Angreifer, weiß, um welche Version von WordPress es sich handelt, kann er gezielt und automatisiert durch Auslesen der readme.html und liesmich.html Schwachstellen nutzen. Wenn diese Informationen durch Entfernen ebendieser Dateien nicht mehr verfügbar sind, wird das Hacken der Seite wieder eine Spur schwieriger.

Sucuri Security entfernt leider nur die readme.html, die liesmich.html sollte manuell entfernt werden.

Mit dem "Broken Link Checker" die Links in einer WordPress-Seite aktuell halten

Broken Link Checker - AllgemeinJetzt bin ich gerade wieder auf einer Hotelseite auf einen Link gestoßen, der ins Leere zeigte ... dumm wenn es sich gerade dabei um die Allgemeinen Geschäftsbedingungen handelt.

Zum Glück gibt es ein Plugin, das ich verwende, das genau dieses Problem verhindert.

Man kann sich unter dem Reiter Allgemein eine E-Mail Benachrichtigung schicken lassen, wenn ein defekter Link entdeckt wurde.

Im "Suchen Sie nach Links in" Reiter lasse ich veröffentlichte Beiträge, Kommentare und Seiten durchsuchen.

Unter Welche Links überprüfen sind "HTML Links" und "HTML Bilder" ausgewählt.

Und bei Protokoll & Schnittstellen ist "Standard HTTP" eingestellt.

Bei Erweitert kann man einstellen, ob auch Redakteure die ungültigen Links sehen können.

Alles in Allem ein sehr nützliches Plugin.