Rewrite mit falschem Ordner

TheJavaKid

Top Contributor
Hallo,

ich bastle gerade an einer Website. Für diesen Zweck will ich (zur Sicherheit) die Dateiendung .php verschleiern. Aus diesem Grund nutze ich folgendes Rewrite:

Code:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.(php|pl|py|cgi|htm|html)
RewriteRule ^/?(.*)\.(php|pl|py|cgi|htm|html)$ /$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]
Das funktioniert soweit auch. Der Zugriff auf login.php / login.html / login.pl etc wird umgeleitet zu /login. Jetzt ist aber das Problem, dass auf dieser Seite Benutzer Profile erstellen können, die mittels Username so aufrufbar sind:

www.domain.com/username

Dabei entsteht natürlich ein Konflikt mit möglichen vorhandenen Dateien. Ich hab mich mal umgesehen, wie andere Seiten das gelöst haben. Am besten hat mir das vorgehen von Twitter gefallen, die alle echten Dateien mit dem Präfix /i/ aufruft. (Also /i/login statt /login).

Das möchte ich in mein Rewrite auch einbauen, allerdings scheitere ich daran. (Ich möchte das mit /s/ - für "system" - lösen). Mod_Rewrite ist leider nicht meine Stärke. Kann mir jemand dabei helfen meine Zeilen so umzubauen, dass echte Dateien (mit Ausnahme von index) nur über folgende Syntax aufgerufen werden können: /s/login, /s/register, /s/pw-forget, etc...? Bzw das ganze auch gleich um eine Zeile ergänzen, die dann /(a-zA-Z0-9) in profile.php?$1 umwandelt, ohne dass eine Weiterleitung auf /s/profile?$1 oder so passiert?

Vielen Dank.
 

Tobse

Top Contributor
Du brauchst einen Lookahead, siehe https://regex101.com/r/ztjtQF/1

Code:
RewriteRule ^/?(?!s/)(.*)$ /$1.php [L]

Hier möchte ich aber ein paar Dinge anmerken:
Wenn du von /login.php auf /login umleitest (deine 301 Rule), dann weiss ich als Angreifer, dass du PHP benutzt. Schicke da einen 404.

Des weiteren:
Vergiss die ganze Aktion von wegen komplizierter Rewrites. Der Stand der Technik in PHP ist inzwischen, dass man alle Requests auf eine index.php leitet und dann mit PHP-Code entscheidet, wie der request behandelt werden soll. Frameworks machen das für dich; wenn du (aus welchem Grund auch immer) kein Framework einsetzt, kannst du die Symfony-Komponenten trotzdem benutzen (funktionieren auch ausserhalb des Frameworks): http://symfony.com/components/Routing
 

TheJavaKid

Top Contributor
Hat leider nicht funktioniert, bin jetzt aber selbst auf die Lösung gekommen:

Code:
RewriteRule ^index\.(php|pl|py|cgi|htm|html)$ / [L,R=301]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.(php|pl|py|cgi|htm|html)
RewriteRule ^(.*)\.(php|pl|py|cgi|htm|html)$ /s/$1 [L,R=301]
RewriteRule ^s/(.*)$ /$1.php [L]

RewriteRule ^([a-zA-Z0-9]+)$ /profile.php?uid=$1

Leider war auch der Tipp mit 404 statt 301 nicht hilfreich, weil ich dann - logisch irgendwie - nur noch ne Fehlermeldung erhalte. 404 eignet sich wohl nicht so gut zum Verschleiern ;) Ich spekuliere einfach darauf, dass ein Angreifer nicht automatisch von PHP, nur weil .php ein 301-Redirect ist, ausgeht (Serversignaturen und PHP-Fehlermeldungen gibt es ohnehin keine) sondern tatsächlich mehrere Dateiendungen probiert und dann erkennt, dass er sich mit der möglichen ersten Vermutung von PHP als benutze Sprache doch nicht mehr so sicher sein kann. Microoptimizing, ich weiß, aber Kleinvieh und Mist und so.

Zu deinem letzten Absatz: Ich weiß, dass das so gehandhabt wird und das ist auch nicht besonders neu. Ich bin allerdings kein Freund von Symphony oder anderen Fertig-Frameworks: Je nach Anforderung programmiere ich alles selbst (außer das JS-Framework, weil jQuery kann man einfach nicht toppen). Ich denke mir nämlich immer, dass ich dann eigentlich gleich ein CMS installieren könnte und das ist nicht unbedingt Sinn der Sache. ^^

Trotzdem danke!
 

Tobse

Top Contributor
Ich bin allerdings kein Freund [...] Fertig-Frameworks: [...] Ich denke mir nämlich immer, dass ich dann eigentlich gleich ein CMS installieren könnte und das ist nicht unbedingt Sinn der Sache. ^^

Warum denn nicht? Wenn das CMS die Anforderungen deines Kunden erfüllt, bsparst du dir einen riesen Haufen Arbeit. Alles jedes mal selbst zu Programmieren ist unnötiger Aufwand.

jQuery kann man einfach nicht toppen
Da stimme ich dir zu - Symfony aber auch nicht. Dass du das selbst besser hinbekommst wage ich stark zu bezweifeln. Und selbst wenn? Warum das Rad neu erfinden? Probiers einfach mal aus, du wirst es mögen ;)
 

TheJavaKid

Top Contributor
Ich mache das für keinen Kunden sondern für Eigenprojekte. Klar, Kunden bekommen ein Wordpress, das ist logisch.

Und doch, meine Frameworks können durchaus mit Symphony mithalten. Ich halte einfach nichts davon aus lauter Fertigteilen was zusammenzuschustern, sondern ich will zu 100% meinen Code haben und keinen anderen. Ausnahmen stellen nur Dinge dar wie zB eine Mobile-Detection oder Telefonnummer-Syntax-Validierung. Und clientseitig eben jQuery. Ansonsten verwende ich nur eigenen Code für eigene Projekte. Da kommt kein Symphony rein, kein Bootstrap, keine jQuery UI oder sonstiges Zeug. Ich hasse es einfach total, wenn ich auf Websites deutlich sehe, wie die die einzelnen Komponenten im Legostyle zusammengesetzt haben. Das ist für mich einfach ein ideeller Wert alles selbst zu machen, wenns um eigene Projekte geht. Deswegen dauert es auch meist einige Jahre bis etwas fertig wird.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben