Sicherheit und Umgang bei gekürztem URL

Duergy

Mitglied
Hyho,

ich habe da mal so eine Frage. Ich würde gerne meine Urls verkürzen

ich weiß garnicht genau wie ich es genau erklären soll.
Eine Url kann maximal aus 3 Teilen bestehen
1. Teil Ordner
2. Teil die PHP-Datei
3. Teil eine ID o. Ä.

Nun habe ich folgende .htaccess
Code:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

und diesen PHP-Code
PHP:
$uri=htmlentities($_SERVER["REQUEST_URI"]);
$url = explode("/",$_SERVER["HTTP_HOST"].$uri);

if(empty($url['3']))
	{
	if(!@include("/content/".$url['1']."/".$url['2'].".php"))
	echo"404";
	}
	else
	{
	if(!@include("/content/".$url['1']."/".$url['2'].".php?todo=".$url['3'].""))
	{
	echo"404";
	}
	}
Wenn ich nun
Code:
http://localhost/user/login
aufrufe
* wird htmlentities auf "/user/login" ausgeführt
* wird ein array $url geschrieben wobei das / an "trenner" fungiert
* dann wird geprüft ob eine ID o.Ä. mitgeliefert wurde oder nicht
* jenachdem ob eine ID mit gegeben wurde oder nicht wird die entsprechende Datei included
* sollte die Datei nicht existieren wird 404 ausgegeben

Nun meine Fragen.
wenn ich
Code:
http://localhost/user//login
also 2 mal / einbaue haut das alles natürlich nicht mehr hin. Ich könnte natürlich
Code:
$uri=str_replace("//", "/", $uri);
einfügen, aber was ist wenn man mal 3 / hat? Dann haut es auch mal wieder nicht hin.
Das heißt man müsste eine art "schleife" machen in der solange // entfernt wird bis es nicht mehr vorkommt.
Klingt für mich jetzt nicht nach einer "eleganten" Lösung. Gibt es da andere Möglichkeiten Reg_Exp oder so?

nächste Frage wie sicher ist das eigentlich. natürlich würde ich in den folgenden PHP-Datei übergebene ID´s etc. nochmal Validieren aber irgendwie habe ich bedenken bei meiner Include variante.

Vllt. gibt es ja auch kompett eine Elegantere/Bessere/Sicherere Lösung?

grüße
Duergy
 
Für den letzteren Fall "mehrere Slashes hintereinander" nimmst Du einfach preg_replace mit der Regel
[/]+ ersetzen durch "/".

PHP:
$url_neu=preg_replace("/[\/]+/","/",$url_alt);
Vorsicht! Grad so hingekliert, vielleicht bedarf es Justage :D UND : $url_alt sollte ohne http:// sein, da auch diese Doppelslashes ersetzt würden.

http://php.net/manual/de/function.preg-replace.php

mfg chmee
 
PHP:
if(!@include("/content/".$url['1']."/".$url['2'].".php?todo=".$url['3'].""))

Das klappt übrigens nicht, da ein [phpf]include[/phpf] ein Zugriff über das Dateisystem ist und das kennt keine Variablenübergabe auf diese Weise.

Ich würde mit einer Whitelist arbeiten, so kannst du gleichzeitig prüfen ob es ein valides Konstrukt ist oder ein unsinniger Request ist und auf eine Default Seite leiten.
 
Also der Code oben funktioniert. Die Sache mit der Whitelist ist natürlich auch keine schlechte bzgl Sicherheit. Noch wer Anregungen?
 
Zurück