WordPress URL-Struktur verstecken…

Es hatte mich schon immer genervt... schon vor einer ganzen Weile hatte ich die Tipps von Sergej Müller umgesetzt, die er zum Schutz des Admin-Bereichs von WordPress anrät. Einer der wichtigsten davon ist meiner Meinung nach, das Stammverzeichnis von WordPress zu verändern. Das Ziel des Ganzen: Bots sollen nicht so einfach den "wp-admin"-Ordner finden können.

Das ganze hat allerdings einen massiven Schönheitsfehler: In jeder generierten Seite ist das Root-Verzeichnis zig Male verlinkt - egal, ob durch Nutzung von Plugins ("../wp-content/plugins/"), durch das Theme ("../wp-content/themes/") oder durch die anderen, typischen Includes ("../wp-includes/", "../xmlrpc.php", etc.).

Um den ganzen Abhilfe zu schaffen, habe ich nun ein kleines, feines Plugin geschrieben, mit dem man die URLs in den durch WordPress generierten Seiten wunderbar verschönern kann. Das ganze basiert auf der Möglichkeit, den gesamten Output von WordPress zu puffern, wie es auf W-Shadow.com gezeigt wird.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
  /*
    Plugin Name: HideStructure
    Plugin URI: https://weizenspr.eu/
    Description: Hides the WordPress URL structure from generated pages.
    Version: 0.4c1
    Author: Kevin Niehage
    Author URI: https://weizenspr.eu

    this code is based on http://w-shadow.com/blog/2010/05/20/how-to-filter-the-whole-page-in-wordpress/
  */


  /* THESE SETTINGS ARE FREE TO EDIT */

  // [ROOT_CONTEXT] MUST begin with a slash
  // but MUST NOT end with a slash or it can be empty
  // if no special root context is in use! In addition
  // you need some URL rewriting to make this work:
  //
  // # hide WordPress URL structure
  // RewriteCond %{REQUEST_FILENAME} !-f
  // RewriteRule ^root\/(.*)$ [ROOT_CONTEXT]/$1 [L]
  //
  // # hide WordPress "wp-content" URL structure
  // RewriteCond %{REQUEST_FILENAME} !-f
  // RewriteRule ^content\/(.*)$ [ROOT_CONTEXT]/wp-content/$1 [L]
  //
  // # hide WordPress "wp-includes" URL structure
  // RewriteCond %{REQUEST_FILENAME} !-f
  // RewriteRule ^includes\/(.*)$ [ROOT_CONTEXT]/wp-includes/$1 [L]

  $hidestructure_rootcontext = "[ROOT_CONTEXT]";

  /* STOP EDITING HERE IF YOU DO NOT KNOW WHAT YOU ARE DOING */

  $hidestructure_after  = "after";
  $hidestructure_before = "before";

  $hidestructure_replacers = array();

  $hidestructure_replacers[] = array($hidestructure_before => $hidestructure_rootcontext . "/wp-content/",
                                     $hidestructure_after  => "/content/");
  $hidestructure_replacers[] = array($hidestructure_before => $hidestructure_rootcontext . "/wp-includes/",
                                     $hidestructure_after  => "/includes/");

  if (strlen($hidestructure_rootcontext) > 0) {
    $hidestructure_replacers[] = array($hidestructure_before => $hidestructure_rootcontext . "/",
                                       $hidestructure_after  => "/root/");
    $hidestructure_replacers[] = array($hidestructure_before => "/root/"."wp-admin/",
                                       $hidestructure_after  => $hidestructure_rootcontext . "/wp-admin/");
  }

  /* STOP EDITING HERE */

  function hidestructure_startbuffering(){
    // do not filter admin pages
    if (!is_admin()){
      // we start buffering here but do not
      // stop it ourself - this is done
      // automatically in "wp_ob_end_flush_all()" in
      // file "/wp-includes/functions.php"
      ob_start("hidestructure_filterpage", 0);
    }
  }

  function hidestructure_replaceslashesA($html) {
    return str_ireplace("/", "%2F", $html);
  }

  function hidestructure_replaceslashesB($html) {
    return str_ireplace("/", "\/", $html);
  }

  function hidestructure_filterpage($html) {
    global $hidestructure_after;
    global $hidestructure_before;
    global $hidestructure_replacers;

    foreach ($hidestructure_replacers as $item) {
      $html = str_ireplace($item[$hidestructure_before], $item[$hidestructure_after], $html);
      $html = str_ireplace(hidestructure_replaceslashesA($item[$hidestructure_before]), hidestructure_replaceslashesA($item[$hidestructure_after]), $html);
      $html = str_ireplace(hidestructure_replaceslashesB($item[$hidestructure_before]), hidestructure_replaceslashesB($item[$hidestructure_after]), $html);
    }

    return $html;
  }

  add_action("init", "hidestructure_startbuffering", 0, 0);
?>

In dem Plugin müsst ihr lediglich den Wert "$hidestructure_rootcontext" anpassen. Dabei handelt es sich um den Namen des Unterordners, in den ihr eure WordPress-Installation verschoben habt. Solltet ihr diese direkt im Hauptverzeichnis stehen haben, müsst ihr diesen String leer lassen. Zudem müsst ihr die .htaccess-Datei eurer Installation anpassen, damit die neuen URLs auch wirklich funktionieren. Angenommen, ihr habt "[ROOT_CONTEXT]" durch den Wert "/my_wordpress_blog" ersetzt, dann sollte so in etwa eure .htaccess-Datei aussehen:

1
2
3
4
5
6
7
8
9
10
11
# hide WordPress URL structure
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^root\/(.*)$ /my_wordpress_blog/$1 [L]

# hide WordPress "wp-content" URL structure
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^content\/(.*)$ /my_wordpress_blog/wp-content/$1 [L]

# hide WordPress "wp-includes" URL structure
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes\/(.*)$ /my_wordpress_blog/wp-includes/$1 [L]

Solltet ihr euren WordPress-Blog übrigens direkt in das Hauptverzeichnis installiert haben, dann könnt ihr die ersten 3 Zeilen der .htaccess-Datei löschen und müsst lediglich die anderen beiden Regeln anpassen, indem ihr den Text "/my_wordpress_blog" entfernt.

Für den Fall, dass ihr alles richtig gemacht und das Plugin aktiviert habt, sollten in euren Webseiten nun keine "wp-content"- oder "wp-includes"-Links mehr vorhanden sein. Stattdessen solltet ihr "content"- und "includes"-Links vorfinden. Bei Leuten, die ihren Blog in ein Unterverzeichnis installiert haben, sollte deren Root-Context durch das Wörtchen "root" ersetzt worden sein.

Was leider nicht möglich ist: Die Links zu überschreiben, die direkt auf den "wp-admin"-Ordner zeigen. Bei meinen Tests wurde ich ausgeloggt, sobald ich versucht habe, über eine "falsche" URL in die Admin-Oberfläche zu gelangen. Aber auch so sollte die Möglichkeit, die interne URL-Struktur zu verstecken, für einige Leute (so wie mich) einen Mehrwert darstellen. 🙂

Zum Schluss noch etwas Rechtliches:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn, diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
Strukturierte Grüße, Kenny

2 Kommentare » Schreibe einen Kommentar

  1. Ich muss es einfach kommentieren. Danke. Habe fast wegen Verzweiflung nen Anfall bekommen. Habe es jetzt sein lassen, da die Schönheitsfehler am Ende der Mühe doch nerven.

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.