PHP Datei auslesen?

... komplette Frage anzeigen

5 Antworten

Dein Formular verwendet, da das 'method'-Attribut nicht angegeben wurde, standardmäßig die GET-Methode, d. h. die abgeschickten Formulardaten werden an die URL mit angehängt. Entweder deklarierst Du also im 'form'-Element explizit die POST-Methode oder Du ziehst Dir im PHP-Teil die übermittelten Werte aus $_GET raus. Achte auch auf Groß- und Kleinschreibung - die meisten Webserver laufen auf Linuxsystemen, da ist 'HOME' etwas anderes als 'home'. Ich empfehle in einem solchen Fall die Kleinschreibung der Dateinamen und somit auch der URL.

Ein dringender Rat aber noch - wenn obiges Script nur für den eigenen Hausgebrauch ist, kann man es so machen, auch wenns schlampig ist. Aber: Auf einer öffentlichen Website öffnest Du damit Tür und Tor für Angreifer, da Du die übermittelten Formularwerte ohne jede Prüfung übernimmst und noch dazu direkt als Dateinamen verwendest. Mit so einem Konstrukt läßt sich unter Umständen der gesamte Server auslesen. Alle Daten, die von einem Browser an Dein Formular gesendet werden, sind grundsätzlich beliebig manipulierbar! Du kannst Dich niemals drauf verlassen, daß Dein Formular Dir als Wert für den Pfad einen von Dir gewünschten Wert wie 'home' sendet. Es könnte auch '/etc/passwd' und ähnliches sein.

Wenn Du von einem Formularelement einen Wert aus einer fest definierten Menge erwartest, hier also entweder 'home' oder 'kontakt', dann solltest Du immer prüfen, ob das auch tatsächlich der Fall ist und ansonsten eine Fehlermeldung ausgeben oder halt eine Standardseite anzeigen. Als ganz einfache Beispiellösung hier (aus dem Stegreif, Syntax nicht getestet):

$pages = array('home', 'kontakt');
if (!empty($_GET['path']) && in_array($_GET['path'], $pages)) {
// Seite anzeigen
} else {
// ungültiger Wert, ggf. Fehlermeldung oder Standardseite
}
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von doctorlutschge
24.02.2017, 11:26

kann ich diese Sicherheitslücke auch so schließen?

if ($_POST['path'] = home || kontakt) {
NÄCHSTE AKTION} else {echo 'ERROR';}
0

Hast du mal $_POST ausgelesen? Wird das Formular gesendet und wenn ja, was kommt an?

<pre>
<?php
var_dump($_POST);
?>
</pre>


Der Value und der Dateiname müssen natürlich gleich geschrieben sein. Wenn die Datei "home.html" heißt, muss der Value natürlich "home" sein und nicht "HOME".

Antwort bewerten Vielen Dank für Deine Bewertung

Du kannst es auch mit einer Variable namens "sektion" machen... Viel leichter zu verstehen.

Du hast eine index.php die immer aufgerufen wird und jeweils Startseite.php, Kontakte.php usw. In deinem content div in der Index.php machst  du include sites.php. Darin steht dann if section = Startseite -> include Startseite.php usw.

Am Ende noch bisschen die htaccess Datei bearbeiten und man hat das was du willst

Antwort bewerten Vielen Dank für Deine Bewertung

mit method-Attribut funktioniert es:

<form method="post">
<input type="submit" value="HOME" name="path" />
<input type="submit" value="KONTAKT" name="path" />
</form>
<?php
if ( isset($_POST['path'])){
$page = file_get_contents($_POST['path'] . '.html');
echo $page;
}

ausserdem müssen KONTAKT.html und HOME.html natürlich im selben Verzeichnis vorhanden sein

Antwort bewerten Vielen Dank für Deine Bewertung

Wieso denn nicht ajax oder ne kombi von button und a (href)

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?