You are not logged in.

  • Login

1

Thursday, March 26th 2009, 7:31am

Adresse verstecken, include über GET Parameter

Sers...
Und ich hab ein kleines Problem ^^

Ich möchte nun den ganzen code nicht nochmal umschreiben aber ich möchte:

Also ich habe die dateien home.php update.php usw.
Ich möchte aber, dass man auf die Seiten mit: index.php?page=home

kommt...

Geht das ganz simpel über eine index.php Datei?

Z.B.: über include?

index.php:

PHP Quellcode

1
2
3
4
5
6
7
8
9
//das wegen den links kommt hier rein
 
...
 
//wenn der link index.php?page=home ist soll
include "home.php";
//kommen
 
usw.


Weil die Seiten sind alle in ein Template eingebettet.
Das will ich nicht in circa 20 Seiten umändern.


Klar soweit?

2

Thursday, March 26th 2009, 7:49am

Du benutzt in der index.php einfach eine Switch Konstruktion.

PHP Quellcode

1
2
3
4
5
6
7
8
switch ($_GET['page']) {
    case 'home':
        include_once('home.php');
        break;
    case 'updater':
        include_once('update.php');
        break;
}


Und komm bitte nicht auf die gloreiche Idee soetwas zu machen nur weil es weniger Schreibarbeit ist.

PHP Quellcode

1
2
3
4
5
switch ($_GET['page']) {
    case 'home':
        include_once($_GET['page'].'.php');
        break;
}

Mehr schreiben, mehr Sicherheit ;)

3

Thursday, March 26th 2009, 8:57am

... damit kann man nämlich alle Dateien laden - nicht nur php files, wie man denken könnte - andererseits ist das beliebige Laden von PHP Files schon schlimm genug ;)

Beispiel Parameter:

PHP Quellcode

1
$_GET['page'] = '/etc/hosts\0'; // (oder per url /etc/hosts%00)

4

Thursday, March 26th 2009, 11:47am

Super danke :)

5

Thursday, March 26th 2009, 12:50pm

Ich steh grad echt aufm Schlauch...

Ich hab den code:

PHP Quellcode

1
2
3
4
5
6
7
8
9
$user = ($_GET['user']);
 
echo $user;
 
switch ($_GET['user']) 
	case '$user';
    	include_once('profil.php?user=$user');
    	break;
}



Bin ich zu doof oder warum geht das nicht?

6

Thursday, March 26th 2009, 1:48pm

Ne, ne ...

siehe auch:
http://de.php.net/switch

Das reicht schon

PHP Quellcode

1
2
3
4
5
switch ($_GET['user']) 
	case 'user': //edit
    	include_once('user.php');
    	break;
}

7

Thursday, March 26th 2009, 1:51pm

nach dem Case-statement kommt ein Doppelpunkt, kein Strichpunkt

PHP Quellcode

1
2
3
4
5
switch ($_GET['user']) 
	case '$user':
    	include_once('profil.php?user=$user');
    	break;
}

8

Thursday, March 26th 2009, 2:45pm

nach dem Case-statement kommt ein Doppelpunkt, kein Strichpunkt

PHP Quellcode

1
2
3
4
5
switch ($_GET['user']) 
	case '$user':
    	include_once('profil.php?user=$user');
    	break;
}

Man kann doch keine GET-Parameter per include mitgeben, oder täusche ich mich grad?

9

Thursday, March 26th 2009, 3:11pm

Man kann doch keine GET-Parameter per include mitgeben, oder täusche ich mich grad?


Ne, das ist auch Käse. Genau wie die Variable im Case.
Dann kann man sich auch das Switch Konstrukt sparen, aber wie oben darauf hingewiesen ist das sehr unsicher
Beim include passiert ja nicht mehr als das die Datei eingebunden wird, dabei läuft afaik nichts durch den parser.

Dabei ging es ja auch um das Semikolon.

10

Thursday, March 26th 2009, 3:39pm

Wenn man das ganze mit der unsicheren Variante macht:

PHP Quellcode

1
2
3
4
5
switch ($_GET['page']) {
    case 'home':
        include_once($_GET['page'].'.php');
        break;
}


Aber vorher abfragt ob diese "$_GET['page'].php" z.b. index.php auf dem Server existiert. Und dann wenn die Abfrage true ist, wird die seite included und wenn nicht gibt es eine Error Seite.
Ist das ganze dann nicht wieder "sicher" und man hat trotzdem viel Schreibarbeit gespart?

11

Thursday, March 26th 2009, 4:03pm

Dann poste ich mal meinen Vorschlag, der relativ sicher sein sollte.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
<?php
$page = trim($_GET['page']);
$dir = './seiten/';
$inc = $dir.$page.'.php';
if(file_exists($inc)) {
 include($inc);
} else {
 echo 'Diese Seite existiert nicht';
}
?>

Hat den Vorteil, dass man nicht in beliebige Verzeichnisse wechseln kann und du musst die Datei nicht immer aktualisieren, wenn neue Seiten hinzukommen. Einfach im Ordner "seiten" (oder wie auch immer du ihn später nennst) die Datei in der Form seitenname.php speichern und per index.php?page=seitenname aufrufen :)

12

Thursday, March 26th 2009, 4:26pm

Dann poste ich mal meinen Vorschlag, der relativ sicher sein sollte.


Das soll jetzt keine Grundsatzdiskussion werden, aber relativ ist genauso ein Unwort wie eigentlich und da liegt meistens das Problem.

Es sollte keinen Grund geben über einen GET Parameter eine Datei zu includen.

Wenn man das wirklich tun möchte, dann muss man penibel alles filtern. Dazu gehören dann auch wie von d0nut angesprochen die Steuerzeichen, die du nicht berücksichtigst sehr oft nicht berücksichtigt werden.

Wenn man diese Variante wählt, dann sollte man einen whitelistfilter einbauen.
Heisst, dass man alle erlaubten Kombinationen in ein Array steckt und das bei dem aufrufen mit dem Input vergleicht.


Man kann auchauf Filterklassen zurück greifen, die schon "relativ" gut sind. Relativ in dem Fall, da es keine 100% sichere Lösung gibt.
Daher sollte man lieber den Case voll ausschreiben. Dann spart man fast immer Zeit und nerven. Denn es gibt genug Leute die langeweile haben und es gibt sehr gute Tools und Manuals (vor allem für den Firefox) die die Manipulation extrem vereinfachen, was man nicht unterschätzen sollte.


//edit
Ich habe eine allgemeinere Formulierung gewählt ;)

13

Thursday, March 26th 2009, 7:09pm

Dann tut's mir natürlich furchtbar Leid, wenn ich hier mit Unworten um mich werfe. Ich wollte lediglich dem Themenstarter ein Grundgerüst zeigen, wie es aussehen KÖNNTE - dass das aber nicht das Sicherste ist, ist mir bekannt.
Aber gut, ist ja egal.

Similar threads

Social bookmarks