Besseres includen

PHP-Fan

Erfahrenes Mitglied
Kann man diesen Include Code Sicherheitstechnisch etwas aufbessern?!

PHP:
<?
$site = (isset ($_REQUEST['site'])) ? $_REQUEST['site'] : '';
$host=$_SERVER['HTTP_HOST'];

if($site=="") {
// News System Include

include("http://$host/main.php?open=news");

}
  else {
			include($site);
}
?>

PHP:
<?
require("http://$host/main.php?open=newest5"); ?>
 
PHP-Fan hat gesagt.:
Kann man diesen Include Code Sicherheitstechnisch etwas aufbessern?!
Oh ja. Prinzipiell sollten alle von außen beeinflussbaren Werte validiert werden. Besonders dann, wenn sie direkten Einfluss auf den Ablauf eines Skriptes haben.
In deinem Fall ist eine Einschleusung von gefährlichen Daten sogar recht einfach (siehe Cross-Site Scripting). Denn es reicht einfach den URL eines Skript-Quellcodes anzugeben und dein Skript erledigt den Rest, nämlich die ungeprüfte Auswertung des Skript-Quellcodes.

Wie gefährlich das sein kann, kannst du selbst ausprobieren: Erstelle einfach eine neues Skript mit folgendem – in diesem Fall harmlosen – Inhalt:
PHP:
<?php

	echo '<?php echo "Buh! Ich bin gefährlich!"; ?>';

?>
Eine einfache Textdatei mit dem auszugebenden Inhalt genügt natürlich auch.

Gibst du nun den URL des Skripts/der Textdatei als Argumentwert an (etwa „?site=http%3A%2F%2Fexample.net%2F“), wird die Ausgabe ausgeführt und es wird „Buh! Ich bin gefährlich!“ ausgegeben.
 
Ist es denn überhaupt notwendig einen beliebigen Wert angeben zu können? Welche Werte sind denn vorgesehen?
 
Eigentlich nur Verweise auf den eigenen Server. Externe sollen gar nicht gestattet sein.
Die Links sehen in etwa so aus:

PHP:
index.php?site=main.php?open=news
index.php?site=main.php&open=showall&group=7
 
Dann solltest du die Werte daraufhin validieren. Am besten speicherst du alle erlaubten Dateien in einem separaten Verzeichnis.
PHP:
$site = ( isset($_REQUEST['site']) && is_readable('/foo/bar/'.basename($_REQUEST['site'])) )
	? '/foo/bar/'.basename($_REQUEST['site'])
	: '';
PS: Übrigens entspricht „site“ nicht dem deutschen „Seite“.
 
Danke schonmal für die Hilfe. Aber das mit dem:

/foo/bar/'.basename($_REQUEST['site'] uswl verstehe ich mal überhaupt nicht :(
 
foo/bar/ is doch nur ein Beispiel ...

Bischen anpassen musst du schon ansonsten gibs da nicht viel zu verstehen, außer die besondere Form. Wenn die Bedingung erfüllt ist bekommt $site den entsprechenden Inhalt und wenn nicht dann ist es ein Leerstring.

@Gumbo und Sir Robin würde nun sagen das das Beispiel nicht race condition sicher ist falls danach noch ein include erfolgt :P Aber wir wollen ja nicht zu viel zumuten :)

mfg
 
Zurück