/file.htm/test.php

Peter Schneider

Legendäres Mitglied
EDIT: da mein Problem relevant für htaccess generell ist, habe ich ein konkretes Beispiel hier aufgeführt:
http://www.ayom.com/topic-21961-st-0.html#entry142641


-------------------------------------

Original-Einstiegs-Post

Ich habe ein relativ grosses Problem. Wenn ich eine htaccess betreibe, dann können Files in der folgenden Art aufgerufen werden:

CODE
http://www.domain.de/wissenschaft/unterseite.htm/test.htm
http://www.domain.de/wissenschaft/unterseite.htm/test.php



Das heisst, "test" existiert nicht, aber die "unterseite.htm" wird dann einfach nochmals ausgegeben.

Teilweise habe ich da extreme Probleme mit, weil sich z.B. die relativen Pfade in "unterseite.htm" unterscheiden und es zu unendlichen Includes kommt.

Wie kann ich das Loch stopfen?

Sprich: es darf nicht möglich sein, nach einer Dateiendung nochmals einen Slash zu nutzen!

Das Problem tritt unter anderem z.B. auch bei Hetzner auf. Es kommt bei der blossen Verwendung einer htaccess.
Das File ".htaccess" kann auch völlig leer sein, der Fehler tritt trotzdem auf. Ist die htaccess auf den Domains gelöscht, dann funktioniert es.

Nochmals: das Problem tritt bei htaccess-Verwendung auf, ist aber nicht in Verbindung mit den darin liegenden
Befehlen. Ich könnte die htaccess leer betreiben, der Fehler kommt! Als Beispiel meine kürzeste htaccess:


CODE
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.de$ [NC]
RewriteRule ^(.*)$http://www.domain.de/$1]http://www.domain.de/$1[R=301,L]

 
Ich weis jetzt nicht genau was dein Problem ist.

CODE http://www.domain.de/wissenschaft/unterseite.htm/test.htm


Wenn ich diese anschaue, dann ist der Fall ziemlich klar. Apache holt sich die Seite http://www.domain.de/wissenschaft/unterseite.htm

Den [.] kennt nämlich Apache in der Verzeichnisstruktur nicht und deshalb funktioniert das auch nicht.

Die Lösung > Ordner anderst anschreiben (ohne "Punkt").

Gruss Marc
 
QUOTE (Peter Schneider @ Sa 8.12.2007, 15:04)Das heisst, "test" existiert nicht, aber die "unterseite.htm" wird dann einfach nochmals ausgegeben.


Das ist ein legitimes Verhalten des Webservers.


QUOTE (Peter Schneider @ Sa 8.12.2007, 15:04)Teilweise habe ich da extreme Probleme mit, weil sich z.B. die relativen Pfade in "unterseite.htm" unterscheiden und es zu unendlichen Includes kommt.


Das hört sich nach einer fehlerhaften Adressierung der Includes an. Da dürfte doch bloß 'unterseite.htm' berücksichtigt werden, nicht 'test.htm'.


QUOTE (Peter Schneider @ Sa 8.12.2007, 15:04)Sprich: es darf nicht möglich sein, nach einer Dateiendung nochmals einen Slash zu nutzen!


Da Du den eigentlichen Aufruf nicht unterbinden kannst (ich kriege ja auch Aufrufversuche von irgendwelchen PHP-Dateien auf einem Windows-Server): Gib bsp. in so einem Fall einen 404 oder 500 und keinen Content aus. Oder entferne das fehlerhafte Ende und leite auf den vorderen Teil weiter.


QUOTE http://www.domain.de/wissenschaft/unterseite.htm/test.htm


Man kann - mindestens auf dem IIS - so etwas beliebig konfigurieren. Dann ist /wissenschaft/unterseite.htm die 'Datei', /test.htm das HttpRequest.PathInfo (hier zufälligerweise mit einem Punkt), danach kann es mit ?name=wert weitergehen. Nicht einmal /wissenschaft/unterseite.htm muß dabei physikalisch existieren. Ich nutze das bsp. zum Sortieren (aufwärts versus abwärts).
 
Es ist besser, das Problem mit einer konkreten Domain zu erläutern:
http://www.frontnews.de/wissenschaft/biologie.php/test.htm
http://www.frontnews.de/wissenschaft/biologie.php/test2.htm
http://www.frontnews.de/wissenschaft/biolo...est54654654.htm

Wie ist das Verhalten zu unterbinden?

Bislang in der htaccess:
CODE
RewriteEngine On
RewriteCond %{HTTP_HOST} ^frontnews\.de$ [NC]
RewriteRule ^(.*)$ http://www.frontnews.de/$1 [R=301,L]


Wegen includes:
Wenn ich die includes relativ adressiere "../", dann verschiebt sich das include um eine Ordnerebene, wenn der Server die Datei "biologie.php" als "biologie.php/test.htm" ausgibt.

Ich betone: DIESES PROBLEM TRITT BEI VERWENDUNG VON HTACCESS AUF. JA: APACHE.

Risiken:
a) Duplicate Content
b) Falsche Adressierung bei Verwendung von PHP und co.

Es ist sehr ärgerlich.

Ich hoste bei zwei Anbietern und bei beiden ist das der Fall.

Das "include"-Problem ist zweitrangig. Alleine die tausendfache Ausgabe ein und derselben Datei ist für mich schon enervierend. Wenn sie unterbunden wird, dann ist alles andere automatisch in Ordnung.

@At all:
Ich will den 404!!!
Bin aber auch mit einem 301 zufrieden

Noch was: Es gibt BOTS, die testen auf solche URLs hin. Die URLs werden bestimmt nirgends so verlinkt.

Ich bin für jede Hilfe dankbar! Bitte schaut Euch das mal auf Euren eigenen Projekten an. Fragen können auch direkt an mich gerichtet werden.
 
htaccess verwende ich nicht. Und das

QUOTE (Peter Schneider @ Sa 8.12.2007, 16:23)Wenn ich die includes relativ adressiere "../", dann verschiebt sich das include um eine Ordnerebene, wenn der Server die Datei "biologie.php" als "biologie.php/test.htm" ausgibt.


finde ich irgendwie merkwürdig, hört sich nach einer Inkonsistenz an. Einerseits wird biologie.php aufgerufen, andererseits von test.htm her gerechnet.

Ein Blick in http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html lehrt, daß es zwei Variablen gibt:

SCRIPT_FILENAME
PATH_INFO

Beim IIS und dem oben verlinkten Beispiel kommen als Rohdaten an:

SCRIPT_NAME /tabellen.html
PATH_INFO /tabellen.html/sample-input/sample-output/sc/A_Name/so/1

Damit:


CODE RewriteCond %{PATH_INFO} ^(.+)\.(.+)/(.+)\.(.+)$ [NC]
RewriteRule ^(.+)\.(.+)/(.+)\.(.+)$ $1.$2 [R=301,L]


Alles, was ich aktuell nicht kenne, habe ich mal blind übernommen (NC, L).

Sprich: Wenn Path_Info zwei Punkte, dazwischen einen Slash enthält, dann entferne alles bis zum ersten Slash nach dem Punkt. Allerdings fehlt mir irgendwie der Domainname - aber da kann vielleicht jemand mit genaueren htaccess-Kenntnissen weiterhelfen.

Es könnte sein, daß man noch ein 'Basisverzeichnis' braucht, also


CODE RewriteBase /


Damit wäre dann der Domainname außerhalb der obigen Regel.
 
Ich werde bestimmt eigene Tests machen.

Ich versteh die Welt aber nicht, dass wenn ich die htaccess völlig leer lasse, dann der selbe Fehler auftritt.
Macht das für Dich Sinn?

Anders rum: die alleinige Existenz einer htaccess führt dazu, dass diese Aufrufe möglich sind.

Noch was: wegen den Includes:

glaub mir, seit mir gestern wegen eines rekursiven Includes 2 GByte an Daten!!! runtergeladen wurden - und ich spreche von einer Seite mit wenigen kByte Umfang, die mehrere tausendmal in sich selbst includiert wurde - staune ich selbst.

Ich werde jetzt mal definitiv keine Seite verlinken, die Euch dann 2Gbyte Daten rüberschickt:
03December.shtm/upload/xax/admin/patch/index.php

Aber schaut Euch mal das Muster an! Hier werden von irgendwelchen "schlechtprogrammierten" BOTS Exploits gesucht.

Die treffen dann auf meine schlechtprogrammierte Seite
laugh.gif


Nein im Ernst: wenn ein Bot wie Slurp oder irgendein Blackhat SEO genau diese Schwachstelle in htaccess/Apache ausnutzt, dann ist das halt suboptimal. Egal, wie sich das Problem dann äussert.
 
QUOTE (Peter Schneider @ Sa 8.12.2007, 18:00)Ich versteh die Welt aber nicht, dass wenn ich die htaccess völlig leer lasse, dann der selbe Fehler auftritt.
Macht das für Dich Sinn?

Anders rum: die alleinige Existenz einer htaccess führt dazu, dass diese Aufrufe möglich sind.

Das dürfte sogar zwingend sein.

Die Webserver sind zunächst für einiges direkt zuständig:

.htm, .html wird ausgeliefert, .php, .asp, .aspx wird an die entsprechende DLL übergeben, anderes (.mdb, .doc, .pdf) wird mit passendem Header ausgeliefert oder blockiert (je nach Konfiguration).

Wenn man mit einer .htaccess arbeitet - oder beim IIS: Wenn man nicht dateiendungsbezogen konfiguriert, sondern eine DLL als Anwendungsplatzhalter deklariert -, dann sagt man ja gerade: 'Jeder Mist soll erst mal von dieser DLL ausgewertet werden, egal, wie verrückt der Gesamtausdruck aussieht'.

Ich habe bei Kunden inzwischen Aufrufpfade

subdomain.server-daten.de/Firmenname-GmbH.5
subdomain.server-daten.de/versicherung/Name-des-Kooperationspartners.15

Da sieht der Code: Kein String .html dazwischen, also nimm die index.folder bzw. die versicherung.folder, dort ist eine Tabelle zugeordnet, finde in der die Zeile 5 bzw. 15, ist Firmenname gleich Ausdruck in der Url, mache weiter, ist er verschieden, paßt er aber 'soft' zur Url, leite per 301 um - falls massiv unterschiedlich, gib 404.

Das einzigste Merkwürdige beim obigen Problem ist, daß zwar die Datei korrekt aufgerufen wird, dann aber Include eine Ebene verschoben wird. Da hat die Include-DLL eine Logik, die sozusagen 'klassisch' ist - alles vor dem letzten '/' ist Ordner, das dahinter ist der Dateiname. Man müßte dieser DLL sagen, daß der Dateiname woanders zu finden sei. Löst man das Problem allerdings im Vorfeld, indem man solche Pfade /ordner/datei.html/test.htm verhindert, dann kriegt die Include-DLL gar nix mehr mit.

In diesem Sinne ist das sogar kein Fehler, sondern Feature. Schließlich kann die Include-DLL nicht wissen, daß die Standardlogik davor durch die ReWriteEngine ausgehebelt wurde.

PS: Durchgeknallte, schlecht programmierte Spider, die irgendetwas falsch verketten, gibt es immer wieder.
 
Hallo!

Ich danke für Deine Ausführungen. Ich verstehe nun, dass das Problem nicht aussergewöhnlich ist. Es fällt mir persönlihc einfach auf, weil irgendwelche Schwachmaten meinen, 1,2 GByte runterladen zu müssen. Deutlich: pro Tag 50 000 PageViews korrekt und 3 Aufrufe nach obigem Schema, die dann jeweils gleich 500 Mbyte rausblasen. Das Verhältnis steht dann 500 MByte Traffik korrekt zu 1500 MByte durch irgendwelche *** innerhalb von wenigen Minuten.

Klar könnte ich die Adressierung der Includes ändern, das würde aber an der "mehrfachen" Nutzung ein und der selben Seite nichts ändern. Wobei der Kernpunkt des Problems ja nicht ist, irgendeinem "Robot" die korrekte Datei anzuzeigen, sondern diesen massiven Download möglichst rasch einzuschränken.

Server-seitig und ausserhalb der htaccess gäbe es da Möglichkeiten?
Könnte man alles, was oberhalb von 2 MByte ist, stoppen? Automatisch, einfach zu konfigurieren?

Ich frage mal so, weil mein "Managed V-Server"-Hoster noch keinen Grund sieht, richtig aktiv zu werden (noch sind die Kapazitätsgrenzen bei der Problemseite nicht erreicht).

Grüsse
 
QUOTE (Peter Schneider @ Sa 8.12.2007, 20:46)Wobei der Kernpunkt des Problems ja nicht ist, irgendeinem "Robot" die korrekte Datei anzuzeigen, sondern diesen massiven Download möglichst rasch einzuschränken.


Das ist falsch. Der Kernpunkt des Problems ist genau das, daß der Robot von einer falschen zur nächsten falschen hopst, anstatt daß er von einer falschen zur richtigen Seite umgeleitet wird - und auf der steht er dann und guckt sich ratlos um. An der Adressierung der Includes herumzuspielen ist wahrscheinlich viel zu aufwendig.


QUOTE (Peter Schneider @ Sa 8.12.2007, 20:46)Server-seitig und ausserhalb der htaccess gäbe es da Möglichkeiten?
Könnte man alles, was oberhalb von 2 MByte ist, stoppen? Automatisch, einfach zu konfigurieren?


Keine Ahnung, ich nutze ja keinen Apache. Ansonsten würde ich einfach einmal in einem neuen Testverzeichnis so etwas


CODE RewriteEngine On
RewriteBase /testverzeichnis
RewriteCond %{PATH_INFO} ^(.+)\.(.+)/(.+)\.(.+)$ [NC]
RewriteRule ^(.+)\.(.+)/(.+)\.(.+)$ $1.$2 [R=301,L]


einspielen und gucken, was passiert, wenn man

/testverzeichnis/einedatei.php

und

/testverzeichnis/einedatei.php/test.htm

aufruft. Eventuell nicht mit dem Browser, sondern direkt mit einem Tool wie dem Download.exe, bsp. als Headerviewer.

Und wenn das funktioniert, dann dasselbe mit '/' als RewriteBase im Stammverzeichnis. Wenn man kein Testsystem hat, heißt das immer hoher Adrenalinspiegel - aber es kann ja bloß besser werden.
 
Jürgen,

ich weiss, ich bin kompliziert und ich bewundere Deine Geduld.

Der 301 oder auch der 404 wären das beste, da sie das Problem an der Wurzel eliminieren. Hierzu müssten wir aber Deinen Code mal vom Spezialisten checken lassen. (Es läuft nicht). Die Logik hinter Deinem Code ist klar.

Der 403 wäre zweite Wahl. Und alles andere definitiv ganz am Schluss.

Sollte man da mal einen neuen Thread zur korrekten Aufgabenstellung schreiben, da der OT hier wirklich abturnt?

Also löschen wäre wohl auch ok!
 
So, kleine Ergänzungen:

Poste mal die angelegte .htaccess und den Pfad von dieser. Aktuell gibt es ja eine Fehlermeldung

CODE [an error occurred while processing this directive]


irgendetwas funktioniert also noch nicht.

Ergänze womöglich


CODE RewriteLog "/usr/local/var/apache/logs/rewrite.log"
RewriteLogLevel 3


mit passender Adresse, dann wird ein Log angelegt.

Schließlich kleine Vereinfachung (ich verwende sonst .NET-RegEx):


CODE RewriteEngine On
RewriteBase /testverzeichnis
RewriteCond %{PATH_INFO} ^(.+)\.(.+)/(.+)\.(.+) [NC]
RewriteRule ^(.+)\.(.+)/(.+)\.(.+) $1.$2 [R=301,L]
 
[an error occurred while processing this directive]

Das ist ein Fehler bei der Ausführung der SSI-Befehle. In dem Beispiel für Dich sind die "includes" relativ, aber halt nicht vorhanden, wenn das File woanders ist...
 
Zurück
Oben