Kleines Problem mit PHP

Hier kann über alles diskutiert werden, wirklich alles. Betonung liegt auf "diskutiert", das ist also kein Freischein zum Spammen.
(Beitragszähler deaktiviert)
Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Kleines Problem mit PHP

Beitrag von Blue.Shark » 3. Apr 2013, 17:13

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?
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

bwoebi
Administrator
Beiträge: 3438
Registriert: 28. Apr 2008, 19:13

Re: Kleines Problem mit PHP

Beitrag von bwoebi » 3. Apr 2013, 17:19

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...
Bogs sind meine Spezialität - Signaturen sind eigentlich doch überflüssig...

Benutzeravatar
Maverick123
Zauberer der Bergwiesen
Beiträge: 625
Registriert: 27. Nov 2005, 13:46

Re: Kleines Problem mit PHP

Beitrag von Maverick123 » 3. Apr 2013, 17:36

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.
BildHerbstwind - Welt 13

Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Re: Kleines Problem mit PHP

Beitrag von Blue.Shark » 3. Apr 2013, 17:53

@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.
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

Rober
Gelbbart-Yeti
Beiträge: 2231
Registriert: 21. Nov 2008, 16:40
Kontaktdaten:

Re: Kleines Problem mit PHP

Beitrag von Rober » 3. Apr 2013, 18:16

Code: Alles auswählen

if("Neuigkeiten"==@$_GET['seite']){...}else{}
tuts auch. Man verhindert nicht alle Fehlermeldungen im gesamten Skript, sondern nur die nach dem @
mfG Rober


_________________
destruktion ist konstruktion

Benutzeravatar
Maverick123
Zauberer der Bergwiesen
Beiträge: 625
Registriert: 27. Nov 2005, 13:46

Re: Kleines Problem mit PHP

Beitrag von Maverick123 » 3. Apr 2013, 18:22

Es ist kein Fehler, es ist eine Notiz :P

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

Code: Alles auswählen

<?php
 echo "Hallo, das hier sind die Neuigkeiten";
?>
BildHerbstwind - Welt 13

bwoebi
Administrator
Beiträge: 3438
Registriert: 28. Apr 2008, 19:13

Re: Kleines Problem mit PHP

Beitrag von bwoebi » 3. Apr 2013, 18:38

Rober hat geschrieben:

Code: Alles auswählen

if("Neuigkeiten"==@$_GET['seite']){...}else{}
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 :P

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)
Bogs sind meine Spezialität - Signaturen sind eigentlich doch überflüssig...

Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Re: Kleines Problem mit PHP

Beitrag von Blue.Shark » 3. Apr 2013, 18:44

@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? :)
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

bwoebi
Administrator
Beiträge: 3438
Registriert: 28. Apr 2008, 19:13

Re: Kleines Problem mit PHP

Beitrag von bwoebi » 3. Apr 2013, 18:51

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.
Bogs sind meine Spezialität - Signaturen sind eigentlich doch überflüssig...

Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Re: Kleines Problem mit PHP

Beitrag von Blue.Shark » 3. Apr 2013, 18:55

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?
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

bwoebi
Administrator
Beiträge: 3438
Registriert: 28. Apr 2008, 19:13

Re: Kleines Problem mit PHP

Beitrag von bwoebi » 3. Apr 2013, 18:57

Ja. Aber kein file_exists ;)
Bogs sind meine Spezialität - Signaturen sind eigentlich doch überflüssig...

Benutzeravatar
Maverick123
Zauberer der Bergwiesen
Beiträge: 625
Registriert: 27. Nov 2005, 13:46

Re: Kleines Problem mit PHP

Beitrag von Maverick123 » 3. Apr 2013, 19:00

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.
BildHerbstwind - Welt 13

Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Re: Kleines Problem mit PHP

Beitrag von Blue.Shark » 4. Apr 2013, 09:30

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^^
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

bwoebi
Administrator
Beiträge: 3438
Registriert: 28. Apr 2008, 19:13

Re: Kleines Problem mit PHP

Beitrag von bwoebi » 4. Apr 2013, 10:51

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...)
Bogs sind meine Spezialität - Signaturen sind eigentlich doch überflüssig...

Benutzeravatar
Blue.Shark
großer Laubbär
Beiträge: 2864
Registriert: 5. Okt 2008, 21:27

Re: Kleines Problem mit PHP

Beitrag von Blue.Shark » 4. Apr 2013, 11:44

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.
Macht alle bei meinem Spiel mit -> Wörter raten
Meine aktuelle User-Idee: Errungenschaften auf Zeit
Meine Wunsch-Idee: Das Haus der Statistiken, Liebligskarte: Etume - das Flusstal. Andere Userideen: Zauber der globalen Wunder

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 34 Gäste