Hilfe zu Register Globals

Bei Register Globals handelt es sich um ein sicherheitskritisches Feature von PHP, welches aktiviert das Überschreiben von Variablen von ausserhalb (z.B. per GET Parameter in der URL) zulässt. Leider ist dieses Feature bei vielen Webservern aus kompatibilitätsgründen zu alter Software aktiviert. Und das, obwohl Register globals seit PHP 4.2.0 standardmäßig deaktiviert ist und ab PHP 6 abgeschafft werden soll.

Das Expblog(und viele andere Content Management Systeme) benötigen zum einwandfreien Betrieb deaktiviertes Register Globals, sprich die php.ini Einstellung register_globals off. Ohne diese Abschaltung ist der Betrieb meistens leider nicht möglich. Sofern Ihr Webspace das in der Grundkonfiguration nicht zur Verfügung stellt, haben Sie mehrere Möglichkeiten dieses nachträglich zu ändern. Allerdings ist zu beachten, daß nicht alle Webhoster Ihren Kunden erlauben diese Einstellung zu verändern. Im Zweifelsfall sollte also der Support des Webhosters zu Rate gezogen werden.

Möglichkeiten zur Änderung des Register Globals Wertes:

Wichtig:


Möglichkeit 1 : Die .htaccess Datei

Dieses ist die gängigste Methode um Register Globals zu deaktivieren und sollte daher bevorzugt werden. Bitte beachten Sie das einige Serverkonfigurationen die .htaccess Datei periodisch einlesen. Haben Sie daher ein wenig Geduld falls die Änderung nicht unmittelbar greift.

Ändern Sie in der Datei .htaccess (liegt im Hauptverzeichnis des Blogs) folgenden Eintrag:

#php_value register_globals 0

in

php_value register_globals 0

oder

php_flag register_globals off

Hier sind, abhängig von der Serverkonfiguration, mehrere Versionen möglich. Testen Sie ggf. alle durch!

Loggen Sie sich danach neu in den Administrationsbereich ein. Sollte die Fehlermeldung Warning: "Illegal offset type in ../blog/admin/header.php on line..." verschwunden sein, war die Änderung erfolgreich.


Möglichkeit 2 : php.ini im Blogverzeichnis

Wenn über die Codeänderung in der Datei .htaccess Register Globals nicht deaktiviert werden konnte, gibt es weitere Möglichkeiten Register Globals zu deaktiveren:

Erstellen Sie eine Datei mit dem Namen php.ini und folgendem Inhalt:

register_globals=off

Dabei gilt es zu beachten, dass manche Server anders mit der php.ini Datei umgehen: Ggf. muss die Datei in jeden Ordner kopiert werden der Skripte beinhaltet, die ausgeschaltete Register Globals brauchen. In anderen Fällen reicht es die Datei nur in das Hauptverzeichnis des Webspaces hochzuladen.


Möglichkeit 3 : ini_set() (nur bis Expblog 0.4.5 möglich)

Über den PHP-Befehl

ini_set("register_globals","off");

kann ebenfalls versucht werden, Register Globals auszuschalten. Der Befehl sollte am besten in die Datei pre_header.php (liegt im include Ordner) und vor allem in die Datei header.php (liegt im admin Ordner) eingefügt werden.

Ändern Sie dazu folgende Zeile in der Datei pre_header.php

include "admin/classes/rss.class.php";

in

include "admin/classes/rss.class.php";

//____________________________________________________________________________________________
//
// Register Globals ausschalten
//____________________________________________________________________________________________

ini_set("register_globals","off");

um.

Und ändern Sie folgende Zeile in der Datei pre_header.php

error_reporting(E_ALL);

in

error_reporting(E_ALL);

// Register Globals ausschalten
ini_set("register_globals","off");

um.


Möglichkeit 4 : Änderung über eine eigene PHP Methode (nur für versierte Nutzer)

Zu guter letzt stelle ich hier noch eine "Fallback" Lösung zur Verfügung, welche ich allerdings nur für den Fall empfehle, daß alle vorherigen Möglichkeiten gescheitert sind. Die Lösung über PHP stellt einen Overhead dar, ist nicht empfehlenswert und sollte wirklich nur im Notfall Anwendung finden.

/* public static */ function unregisterGLOBALS()
{
  if(ini_get('register_globals'))
  {
    if(isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS']))
    {
      // die('FATAL::GLOBALS overwrite attempt detected. Your IP has been logged.');
    }
    $noUnset = array(
      'GLOBALS',
      '_GET',
      '_POST',
      '_COOKIE',
      '_REQUEST',
      '_SERVER',
      '_ENV',
      '_FILES'
    );
    $input = array_merge(
      $_GET,
      $_POST,
      $_COOKIE,
      $_SERVER,
      $_ENV,
      $_FILES,
      isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array()
    );
    foreach($input as $x => $y)
    {
      if(!in_array($x, $noUnset) && isset($GLOBALS[$x]))
      {
        unset($GLOBALS[$x]);
      }
    }
  }
}

Klar sollte sein, daß diese Methode möglichst weit Oben im Script aufzurufen ist..

Demoblog

Zum Testen des Blogs steht eine Online Demo zur Verfügung. So können Sie das Expblog vor dem Download auf Herz und Nieren prüfen.

Benutzername: demo
Passwort: demo



Anleitungen & Tutorials



Weitere Dokumente