Seite 1 von 3
Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 17:13
von Blue.Shark
Hallo,
ich bin gerade etwas dabei PHP zu lernen um eventuell mal eine eigene Webseite aufzubauen. Dabei soll sie aus einer Hauptseite bestehen und dann mehrere Verlinkungen, z.B Neuigkeiten, Kontakt usw.
Ich scheitere aber an der Get-Methode. Folgender Code hab ich mal zum testen geschrieben:
test.php
Code: Alles auswählen
<?php
$seite = $_GET['seite'];
if ($seite == "Neuigkeiten")
echo "Hallo, das hier sind die <b>". $seite . "</b>.";
/* hier kommt die Seite "Neuigkeiten" rein */
else{
?>
<h1> Webseite </h1>
<!Hier ist die komplette Webseite (Startseite) mit allen möglich Verlinkungen>
<a href="test.php?seite=Neuigkeiten">Neuigkeiten</a>
<?php
}
?>
geh ich nun auf die Seite "test.php" kommt ein Fehler, dass der index "seite" nicht erkannt wird.
Klick ich auf den Link "Neuigkeiten" funktioniert alles so wie ich es mir vorstell, ich komme auf eine neue Seite "test.php?seite=Neuigkeiten" und sehe die Ausgabe "Hallo, das hier sind die Neuigkeiten."
Weiß jemand woran das liegt bzw. wie ich das lösen kann?
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 17:19
von bwoebi
if (isset($_GET["seite"]) && ($seite = $_GET['seite']) == "Neuigkeiten") {
...
} else {
...
}
so meinste?
immer zuerst auf isset() prüfen, erst dann kannste auch die Variable (das array) benutzen...
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 17:36
von Maverick123
Alternativ kannst du auch die Fehlermeldungen einschränken und folgendes am Anfang deines PHP-Codes schreiben:
error_reporting(E_ALL ^ E_NOTICE);
Dadurch wird E_NOTICE nicht geworfen, darunter fallen zum Beispiel Fehlermeldungen wegen ungesetzten Variablen wie in diesem Fall. Das erspart einem, immer erst zu prüfen, ob Variablen überhaupt gesetzt wurden.
E_NOTICE meldet sich, wenn im Code etwas gefunden wird, was Fehler verursachen könnte (kann natürlich auch der Fall sein, dass es wirklich eine Fehlerquelle findet). Es ist also nicht unbedingt Pflicht, darauf einzugehen.
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 17:53
von Blue.Shark
@bwoebi: Danke, hab den Code so umgeändert und es funktioniert, vielen Dank!:
Code: Alles auswählen
<?php
if(isset($_GET['seite'])){
$seite = $_GET['seite'];
if ($seite == "Neuigkeiten")
echo "Hallo, das hier sind die <b>". $seite . "</b>.";
/* hier kommt die Seite "Neuigkeiten" rein */
}
else
echo "<a href=\"?seite=Neuigkeiten\">Neuigkeiten</a>";
?>
@Maverick123: Ist natürlich auch eine Methode, allerdings sollte man solche Warnungen/Fehler nicht einfach ignorieren sondern bestenfalls beheben, finde ich.
Ist das eigentlich sinnvoll wie ich das vorhabe? Oder ist es besser verschiedene php-Seiten anstatt die Get-Methode zu nutzen? Also wenn auf der Hauptwebseite (index.php) der Link "Neuigkeiten" geklickt wird, wird auf eine neue Seite "Neuigkeiten.php" gelinkt, in der dann die Neuigkeiten stehen.
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 18:16
von Rober
tuts auch. Man verhindert nicht alle Fehlermeldungen im gesamten Skript, sondern nur die nach dem @
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 18:22
von Maverick123
Es ist kein Fehler, es ist eine Notiz
Ist im Grunde schon okay, wie du das vor hast. Du kannst den Inhalt deiner einzelnen Seiten trotzdem in anderen Dateien auslagern und diese dann includen. Das ist später übersichtlicher.
index.php
Code: Alles auswählen
<?php
$seite = $_GET['seite'];
$datei = $seite . ".inc.php";
if(file_exists($datei))
{
include($datei);
}
else
{
include("start.inc.php");
}
?>
start.inc.php
Code: Alles auswählen
<?php
echo "<a href=\"?seite=news\">Neuigkeiten</a>";
?>
news.inc.php
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 18:38
von bwoebi
Rober hat geschrieben:
tuts auch. Man verhindert nicht alle Fehlermeldungen im gesamten Skript, sondern nur die nach dem @
Warum ich nur davon abraten kann:
http://www.phpgangsta.de/wp-content/upl ... erator.pdf
@Mav: es ist ansichtssache… aber ich krieg iwie immer das kotzen bei solchem Code
EDIT: @Mav: Darf ich auch die /etc/passwd\0 als seite-Parameter übergeben? Gibt mir die Datei aus... oder einfach eine http://url…/bla.php.inc damit aufrufen (unter Annahme dass allow_url_include aktiv ist)
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 18:44
von Blue.Shark
@Maverick123: Ja, danke, so wird das dann richtig übersichlich. Das ".inc" verwirrt mich aber irgendwie, tut aber auch ohne oder?
@bwoebi: Wie würdest du es dann lösen wenn du das nicht gut findest?

Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 18:51
von bwoebi
So wie du es gemacht hast.
das .inc ist unwichtig. Aber setz es bloß nicht so um wie Mav es sagt, das ist eine Sicherheitslücke. Was du tun kannst ist: if (in_array($_GET["seite"], ["kontakt", "start", "news", "..."])) include "includes/{$_GET['seite']}.php";
Also per Whitelist.
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 18:55
von Blue.Shark
bwoebi hat geschrieben:
das .inc ist unwichtig. Aber setz es bloß nicht so um wie Mav es sagt, das ist eine Sicherheitslücke. Was du tun kannst ist: if (in_array($_GET["seite"], ["kontakt", "start", "news", "..."])) include "includes/{$_GET['seite']}.php";
Also per Whitelist.
Oha das ist mir dann doch zu kompliziert
bwoebi hat geschrieben:So wie du es gemacht hast.
Wenn ich mit if ($seite == "Neuigkeiten") abfrage kann ich dannach trotzdem ein include bringen oder?
Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 18:57
von bwoebi
Ja. Aber kein file_exists

Re: Kleines Problem mit PHP
Verfasst: 3. Apr 2013, 19:00
von Maverick123
Naja, aber es schadet trotzdem nicht zu überprüfen, ob die Datei, die du includen willst, vorhanden ist. Ansonsten stimmt es natürlich, sicher gegen Eingriffe von außen ist mein Script nicht.
Re: Kleines Problem mit PHP
Verfasst: 4. Apr 2013, 09:30
von Blue.Shark
Maverick123 hat geschrieben:Naja, aber es schadet trotzdem nicht zu überprüfen, ob die Datei, die du includen willst, vorhanden ist. Ansonsten stimmt es natürlich, sicher gegen Eingriffe von außen ist mein Script nicht.
Warum ist das eigentlich nicht sicher? Wie soll da von Außen eingegriffen werden? Hab lange nachgedacht komm aber nicht drauf^^
Re: Kleines Problem mit PHP
Verfasst: 4. Apr 2013, 10:51
von bwoebi
Da kommste auch nicht durch Nachdenken drauf. Die C-Implementation davon macht einen System Call zur Funktion "access (const char *filename, int how)". Die meisten Standart-C Implementierungen denken von einem Memory-Block der als char * gekennzeichnet sind, der String würde beim ersten Null-Byte (binär: 00000000) aufhören. Bei include ist das Problem dasselbe, nur eben eine andere Funktion.
Das heißt wenn der Angreifer ein Null-Byte einschleusen (den String: "/etc/passwd\0" als seite-Parameter übergibt) kann, sieht der String den du include und file_exists übergibst so aus: "/etc/passwd\0.inc.php" (\0 ist das Null-Byte). Jetzt wird intern der String bei \0 abgeschnitten; Resultat: "/etc/passwd". Die Datei der User. (Man kann theoretisch auch direkt damit php-code dank data/base64... einschleusen...)
Re: Kleines Problem mit PHP
Verfasst: 4. Apr 2013, 11:44
von Blue.Shark
Ok. Komisch dass eine solche Funktion überhaupt zur Verfügung gestellt wird wenn sie so Sicherheitslücken hat. Ich denke mal nicht dass das allen bewusst ist.