Es lohnt sich, den direkten Zugriff auf Themendateien einzuschränken?

31

Von Zeit zu Zeit bin ich auf das folgende Snippet in Themes gestoßen:

if ( ! defined('ABSPATH')) exit('restricted access');

Es steht am Anfang einiger (aller?) PHP-Dateien in einem Theme und soll den direkten Zugriff schädlicher Quellen auf die Datei verhindern.

Ich sehe, dass dies nicht in Twenty Ten oder Eleven enthalten ist und ich habe es nie in der offiziellen WordPress-Dokumentation empfohlen gesehen. Es scheint mir eine gute Idee zu sein, aber ich weiß auch nicht genug über Sicherheit, um es beurteilen zu können, und kann bei Google nicht viel finden.

Ist das etwas, was ich in meinen benutzerdefinierten Designs haben sollte? Wenn ja, sollte es in allen PHP-Dateien sein oder nur in einigen?

mrwweb
quelle
7
Nur für spätere Leser kann dies kürzer und schöner geschrieben werden:defined('ABSPATH') OR exit;
Kaiser
oder noch kürzer defined('WPINC') ? : die();
Tim Elsass
Ich frage mich auch, ob es sich lohnt, Code wie diesen einzufügen, um zu vermeiden, dass PHP-Fehler zu undefinierten Funktionen in meinen Fehlerprotokollen angezeigt werden. Bots scheinen diese Dateien manchmal gerne direkt zu treffen und ich erhalte Fehler wie "Aufruf der undefinierten Funktion query_posts ()", weil der WP-Bootstrap nicht geladen wurde
Matt Keys

Antworten:

26

Normalerweise brauchst du es nicht. Aber… es gibt mindestens einen Randfall:

  • Wenn ein Thema Datei ist eine Vorlage Teil ,
  • und es verwendet globale Variablen aus dem aufrufenden Kontext (übergeordnete Datei),
  • und register_globals ist on,
  • und es werden nur diese Variablen ohne Sicherheitsprüfung verwendet ...

… Kann ein Angreifer diese Datei aufrufen, die fehlenden Variablen mit GEToder setzen POSTund die Themendatei zum Ausdrucken bringen. Und dann gibt es ein Sicherheitsproblem.

Also… die beste Option ist nicht eine Kontextprüfung wie in Ihrem Beispiel, sondern ein guter Code: Vermeiden Sie globale Variablen, überprüfen Sie deren Inhalt, bevor Sie sie ausdrucken.

In einigen Fällen füge ich die Kontextprüfung hinzu, wenn ich denke, dass jemand anderes meinen Code verwendet und ihn ohne Rücksicht auf die Sicherheit ändert. Es tut nicht weh.

fuxia
quelle
Wenn ein Template-Teil noch mindestens einen Funktionsaufruf enthält, der einen schwerwiegenden PHP-Fehler verursachen würde, ist dieses Szenario dennoch möglich?
Chris_O
@Chris_O Hängt von der Reihenfolge des Auftretens ab.
Fuxia
Ergibt Sinn und ist sich vollkommen einig, warum globale Variablen nicht zwischen Dateiaufrufen verwendet werden sollten.
Chris_O
1
Es ist immer am besten, auf Nummer sicher zu gehen. Zu viel Sicherheit kann doch nicht schaden, oder?
Sean Berg
2
Wenn Sie alles richtig machen, sollten Sie keinen Code verwenden, der nicht benötigt wird. Diese Frage ist der Beweis, dass es schwieriger ist, dem Code zu folgen.
fuxia