WP

Ronald Huereca erklärt in einem Artikel auf Devlounge, wie man dafür sorgt, dass die wp-config.php der WordPress-Installation nicht für Hacker einfach erreichbar ist um so die Möglichkeit eines Hackerangriffs auf das eigene Blog zu erschweren.

Die wp-config.php ist der Schlüssel zur Datenbank und damit stehen einem Eindringen in die Datenbank nur wenige Handgriffe bevor und schon liegt die DB offen, Damit kann ein „Bösewicht“ die Daten verändern oder gar alle Daten löschen. Also liegt es nahe, diese Datei vor fremden Zugriff zu schützen. Wie und und mit welchen Mitteln man dies machen kann, das erklärt der Artikel auf zwei unterschiedliche Wegen.

Ich habe die jeweiligen Code-Schnippsel im Anschluss nochmal hinterlegt, da ich die Idee für sinnvoll und machbar, auch für den „Laien“, erachte, so dass man auch mit deutschen Sprachkenntnissen der Idee folgen und umsetzen kann.

.htaccess erweitern

Ronald erklärt zwei unterschiedliche Ansätze. Im ersten Schritt sichert er den Zugriff via .htaccess, was schnell und einfach erledigt ist.

# protect wpconfig.php
<files wp-config.php>
Order deny,allow
deny from all
</files>

Damit könnte eine .htaccess für WordPress folgenden Aufbau und Inhalt haben, wobei ich gleich einige mehr Regeln integriert habe, kleine Erläuterungen dazu im Syntax.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# www2nowww
RewriteCond %{HTTP_HOST} ^([^.]+).bueltge.de$ [NC]
RewriteRule ^(.*)$ http://bueltge.de/$1 [R=301,L]

# Hinzufuegn von Slash
RewriteCond %{REQUEST_URI} ^/[^.]+[^/]$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# Schutz der wp-config.php
<files wp-config.php>
Order deny,allow
deny from all
</files>

# Datei zum Regeln von IP-Bereichen
Order deny,allow
Allow from all
# Sperre folgende IPs
deny from 83.246.96.42
deny from 82.103.133.221
deny from 74.86.15.2

Auslagern der wp-config.php

Die zweite Idee geht davon aus, dass die Datei an einen Ort des Servers verschoben wird, der nicht öffentlich zugänglich ist. Ein Beispiel soll es verdeutlichen: die Datei liegt im Normalfall im absoluten Pfad /home/deinname/public_html/, dies ändert sich nun, denn die Datei wird eine Ebene tiefer abgelegt /home/deinname/. Dies ist nicht bei allen Webhostern so, so dass die Möglichkeit nicht bei allen WordPress-Installationen möglich ist.

Die klassische wp-config.php enthält folgenden Syntax.

<?php
// ** MySQL settings ** //
define('DB_NAME', 'wpbeta');    // The name of the database
define('DB_USER', 'root');     // Your MySQL username
define('DB_PASSWORD', ''); // ...and password
define('DB_HOST', 'localhost');    // 99% chance you won't need to change this value
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

// You can have multiple installations in one database if you give each a unique prefix
$table_prefix  = 'wp_';   // Only numbers, letters, and underscores please!

// Change this to localize WordPress.  A corresponding MO file for the
// chosen language must be installed to wp-content/languages.
// For example, install de.mo to wp-content/languages and set WPLANG to 'de'
// to enable German language support.
define ('WPLANG', 'de_DE');

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

define('ABSPATH', dirname(__FILE__).'/');
require_once(ABSPATH.'wp-settings.php');
?>

Mit diesen Daten erstellt ihr eine neue Datei config.php.

<?php
// ** MySQL settings ** //
define('DB_NAME', 'wpbeta');    // The name of the database
define('DB_USER', 'root');     // Your MySQL username
define('DB_PASSWORD', ''); // ...and password
define('DB_HOST', 'localhost');    // 99% chance you won't need to change this value

// You can have multiple installations in one database if you give each a unique prefix
$table_prefix  = 'wp_';   // Only numbers, letters, and underscores please!
?>

Diese Datei wird nun per FTP in das nicht öffentliche Verzeichnis des Servers kopiert, in unserem Beispiel ist das /home/deinname/

Die originale wp-config.php wird nun verändert. Dabei werden die Datenbank-Verbindungsdaten mit Hilfe der include-Anweisung eingebunden.

<?php
include('/home/deinname/config.php');

// Change this to localize WordPress.  A corresponding MO file for the
// chosen language must be installed to wp-content/languages.
// For example, install de.mo to wp-content/languages and set WPLANG to 'de'
// to enable German language support.
define ('WPLANG', 'de_DE');

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

define('ABSPATH', dirname(__FILE__).'/');
require_once(ABSPATH.'wp-settings.php');
?>

Damit stehen WordPress die Daten für die Datenbank zur Verfügung und die Datei kann nicht einfach als Text angezeigt werden, denn sie liegt in einem nicht öffentlichen Bereich.