PHP: INCLUDE zum dynamischen Einfügen von Inhalten

  • #1
A

Ace_NoOne

Bekanntes Mitglied
Themenersteller
Dabei seit
07.04.2002
Beiträge
403
Reaktionspunkte
0
Ort
Germany
Hallo zusammen,

als relativer PHP-Neuling benötige ich etwas Rat in Bezug auf die Verwendung von INCLUDE:

Meine Website besteht aus den üblichen Modulen: Header, Nav-Menü, Hauptbereich und Footer. Nur der Hauptbereich ändert sich, alles andere bleibt immer gleich.
Nun habe ich mir überlegt, die jeweiligen Inhalte des Hauptbereiches in separaten Dateien zu lagern und diese jeweils per URL-Parameter zu bestimmen. Die entsprechende Inhaltsdatei wird dann per INCLUDE eingefügt.

Allerdings bin ich mir nicht sicher, ob dies ein sauberer und auch sicherer Weg ist.
Zwar lagern die Inhaltsdateien in einem separaten Ordner, sodass (hoffentlich) nicht auf Dateien außerhalb dieses Ordners zugegriffen werden kann - aber vielleicht gibt es noch andere Sicherheitslücken, die ich mangels Erfahrung nicht erkennen kann!?

Hier ist mein bisheriger Code:
Code:
	<!-- Content Area -->
	<div id=content>
		<?php
			// settings
			$contentDir = content;
			$contentExt = html;
			$defaultContent = news;
			// get URL parameter
			$content = $_GET{content};
			// check whether parameter is empty
			if ($content == ) {
				// set default content
				$content = $defaultContent;
			} else {
				// make sure no parent directory can be accessed
				$content = str_replace(../, , $content); // DEBUG: not safe? (e.g. ....////) => disallow all slashes?
			}
			// check whether respective file exists
			$contentSource = $contentDir . / . $content. . . $contentExt;
			if (is_file($contentSource)) {
				// read content from file
				include($contentSource);
			} else {
				echo Bad parameter: Error reading content source.;
			}
		?>
	</div>

Für Kommentare und Anregungen wäre ich dankbar!
 
  • #2
eine frage

und zwar -> was genau übergibst du mit content???

$_GET{content} << das hier mein ich ^^
 
  • #3
Übergeben wird z.B. news; damit wird dann etwa die Datei ./content/news.html (diese enthält natürlich nicht das HTML-Grundgerüst) eingebunden.

Den Code habe ich mitterweile etwas angepasst, um die Sicherheit zu verbessern:[Korrektur - siehe unten]
 
  • #4
und mit $_GET['content'] hast du es auch schon einmal probiert oder?
 
  • #5
Was probiert?

Vielleicht hatte ich micht nicht klar ausgedrückt:
Die URL wäre z.B. index.php?content=news, sodass an der Stelle des PHP-Skriptes der Inhalt der entsprechenden Datei (./content/news.html) eingefügt würde - sofern diese im Verzeichnis content exisitert.
 
  • #6
ja das ist schon klar

NUR

anstatt $content = $_GET{content}; versuchs mal mit $content = $_GET['content'];

im quelltext
 
  • #7
Oh, sorry - mein Fehler!
Ich hatte, aus welchem Grunde auch immer, nochmals die alte Version gepostet.
Hier ist die aktuelle Version:
Code:
	<div id=content>
		<?php
			// settings
			$contentDir = content;
			$contentExt = html;
			$contentName = news; // default content
			// get URL parameter (content)
			if (!empty($_GET[content])) {
			  $contentName = basename($_GET['content']); // ensures that no directories can be accessed
			}
			// check whether respective file exists
			$contentSource = $contentDir . / . $contentName . . . $contentExt;
			if (is_file($contentSource)) {
				// transclude content
				include($contentSource);
			} else {
				echo Bad parameter: Error reading content source.;
			}
		?>
	</div>

Allerdings macht es meines Wissens keinen Unterschied, ob ich jetzt $_GET{content} oder $_GET[content] benutze...
 
  • #8
versuchs doch mal mit zwischen ausgaben ... so echos können sehr nützlich sein ^^
 
  • #9
Habe ich ja getan; der Code funktioniert so.
Die Frage ist, ob die Verbindung von INCLUDE mit ungefilterter Übernahme eines URL-Parameters eine Sicherheitslücke darstellt. (Wobei der Parameter ja jetzt mit BASENAME gefiltert wird, sodass keine Ober- oder Unterverzeichnisse angesprochen werden können - hoffe ich zumindest...)
 
  • #10
Ace_NoOne schrieb:
Habe ich ja getan; der Code funktioniert so.
Die Frage ist, ob die Verbindung von INCLUDE mit ungefilterter Übernahme eines URL-Parameters eine Sicherheitslücke darstellt. (Wobei der Parameter ja jetzt mit BASENAME gefiltert wird, sodass keine Ober- oder Unterverzeichnisse angesprochen werden können - hoffe ich zumindest...)

und wieso fragst du noch wenn du die lösung hast? *lol*

dann hat sichs ja erledigt und sonst kannst du ja nach einem . oder / im content suchen und falls es das gibt, kommt einfach nichts ^^ zum beispiel

gruss

billy
 
  • #11
Ich frage deshalb, weil ich wenig Erfahrung habe mit PHP - vielleicht gibt es ja noch andere Möglichkeiten, als mittels / Ober- oder Unterverzeichnisse ansprechen zu wollen!?
(Steht aber alles auch im Original-Posting... ;) )
 
Thema:

PHP: INCLUDE zum dynamischen Einfügen von Inhalten

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.961
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben