Seite 1 von 1

PHP: Frage zu kleinem Umleitungsscript

Verfasst: 06.03.2009, 18:54
von webpilot
Ich habe ein kleines Umleitungsscript geschrieben. Ziel ist es, mittels GET eine ID zu übergeben, nach dieser dann umgeleitet wird.

Code: Alles auswählen

<?php
	// Startseite definieren
	define &#40;'START', 'http&#58;//www.abakus-internet-marketing.de/'&#41;;
	
	// GET in Variable speichern
	$redirect_id = $_GET&#91;'id'&#93;;
	// Länge ermitteln
	$length = strlen&#40;$redirect_id&#41;;
	if &#40;is_int&#40;$redirect_id&#41; && &#40;$length == 4&#41;&#41; &#123;

		switch&#40;$redirect_id&#41; &#123;
		case 1001&#58;
		$site = 'http&#58;//www.google.de/';
		break;

		case 1002&#58;
		$site = 'http&#58;//www.microsoft.com/';
		break;

		case 1003&#58;
		$site = 'http&#58;//www.yahoo.com/';
		break;
		
		// Im Falle einer ungültigen ID wird START als Ziel definiert
		default&#58;
		$site = START;
		break;
		&#125;

	&#125; else &#123;

	$site = START;

	&#125;

	header&#40;'Status&#58; 301 Moved Permanently'&#41;;
    header&#40;'Location&#58;'.$site&#41;;
    exit;
?>
Ich habe erst eine IF-Abfrage implementiert, mit der ich prüfen wollte ob A: es sich beim übergegebenen Parameter um einen Integer handelt und B: ob dieser 4 Stellen hat (z.B. 1234). Trifft dies zu, wird eine Liste abgearbeitet, wo ich die Seiten definieren möchte. Wenn kein Wert zutrifft, kommt wieder die Default-Seite.

Leider greift die Switch-Anweisung nicht. Wenn ich die Seite mit index.php?id=1003 (yahoo.de) aufrufe, werde ich trotzdem auf die Default-seite umgeleitet. Ich vermute irgendwie ein Problem mit dem Integer-Variable.

Kann wer helfen? Gibt es vielelicht noch etwas bzgl. Sicherheit zu beachten? PHP ist noch etwas "gewöhnungsbedürftig" für mich... ;)

Verfasst:
von

Verfasst: 06.03.2009, 19:02
von MrTunes
is_numeric?
aber wozu die fragerei.
die switch reicht doch.

Verfasst: 06.03.2009, 19:14
von webpilot
Ich dachte mir, dass ich so bereits im Vorfeld faule GET-Werte eleminiere und nicht die ganze Switch-Schleife durchlaufen lassen muss. Du würdest also nur eine is_numeric Prüfung mit anschliessendem Switch machen?

Danke schon mal.

Verfasst: 06.03.2009, 19:17
von MrTunes
ich hab ja überhauipt keine ahnung von php...
aber ich würde nur auf die werte prüfen.

Re: PHP: Frage zu kleinem Umleitungsscript

Verfasst: 06.03.2009, 21:28
von net(t)worker

Code: Alles auswählen

....
$redirect_id = trim&#40;$_GET&#91;'id'&#93;&#41;;
....
leerzeichen am Anfang und Ende entfernen... können immer mal dazukommen, und schon stimmt die länge nicht mehr

Verfasst: 07.03.2009, 12:33
von Synonym
Zahlen die per GET übergeben werden sind in dem Sinne keine Zahlen (int) mehr, sondern ein String. is_int() funktioniert daher nicht.

is_numeric() währe ein Ansatz, kann aber nicht auf Ganzzahlen prüfen. 123.4 würde da auch zutreffen. Alternativ geht aber ctype_digit() falls vorhanden.

Ich würde auch das strlen() weg lassen und eher prüfen ob die Zahl größer 1000 und eventuell kleiner als eine maximaler Wert ist.

Verfasst: 07.03.2009, 13:15
von DanielS
Synonym hat geschrieben:Zahlen die per GET übergeben werden sind in dem Sinne keine Zahlen (int) mehr, sondern ein String. is_int() funktioniert daher nicht.
Das stimmt.
In den Kommentaren auf der Manual-Seite zu is_int() gibt ein paar weitere Alternativen: https://de.php.net/is_int

Re: PHP: Frage zu kleinem Umleitungsscript

Verfasst: 07.03.2009, 13:50
von Mork vom Ork
webpilot hat geschrieben:Gibt es vielelicht noch etwas bzgl. Sicherheit zu beachten? PHP ist noch etwas "gewöhnungsbedürftig" für mich... ;)
Zur Sicherheit nicht, aber zum Stil:

$_GET ist eine Variable wie jede andere auch, mit der Ausnahme, dass sie bereits vorab gefüllt wird. Es ist daher unnötig, den Inhalt von $_GET zur Nutzung erst in eine andere Variable zu kopieren. Dies:

Code: Alles auswählen

$redirect_id = $_GET&#91;'id'&#93;;
// Länge ermitteln
$length = strlen&#40;$redirect_id&#41;;
if &#40;is_numeric&#40;$redirect_id&#41; && &#40;$length == 4&#41;&#41; &#123;
kannst du genauso gut so schreiben:

Code: Alles auswählen

if &#40;is_numeric&#40;$_GET&#91;'id'&#93;&#41; && &#40;strlen&#40;$_GET&#91;'id'&#93;&#41; == 4&#41;&#41; &#123;
Ich finde dieses Eimerchen-Spiel (Daten von hier nach da nach dort kopieren, ohne tatsächlich mit ihnen zu arbeiten) zudem immer etwas verwirrend.

Davon unabhängig: Ich weiß nicht, wie lang deine switch-Liste werden soll und von wem sie aufgerufen wird, aber den Aufwand, erst zu prüfen, ob $_GET['id'] zweier Vorgaben entspricht, kannst du dir IMHO sparen. Du steckst da in der Summe der korrekten Angaben mehr unnütze Arbeit rein, als du bei den vermutlich seltenen Fehleingaben an Millisekunden einsparst.
Du würdest mehr sparen, würdest du zwei verschachtelte Blöcke bauen, der äußere prüft das erste Zeichen, die inneren die drei anderen Zeichen, (also quasi einen Index auf das erste Zeichen anlegen).

Was du allerdings vergessen hast, ist vor dem Zugriff auf $_GET['id'] mit isset() zu prüfen, ob $_GET['id'] überhaupt existiert.

Und wird die switch-Liste sehr lang, ist sie so oder so der falsche Weg, dann solltest du eine ordentliche Datenhaltung vorsehen. Das muss nicht gleich eine SQL-Datenbank sein, eine indizierte Datei im dbm-Stil reicht schon.

Verfasst: 10.03.2009, 11:05
von webpilot
Danke für Eure Hilfe.