Am Donnerstag, den 26.11.2020, 08:38 +0100 schrieb Luca Bertoncello:
Ich will eine Seite schützen, genau gesagt, eine <Location>, die dann auf einem anderen Server per Proxy weiterleitet. Dabei kann ich weder eine Prüfung nach IP noch eine BaseAuth nutzen, denn das Programm, das die Seite später nutzt keine BaseAuth kann und es kommt u.U. aus verschiedenen dynamischen IPs.
Ich würde, wie viele andere machen, eine sogenannten API-Key nutzen, so dass die Anfragen im Format https://mein.seite.de/blub/1/2/3.png?key=<mein Key> sind.
Ich kann aktuell folgendes machen (und funktioniert):
<Location /blub> <If "%{QUERY_STRING} =~ /key=123456789/"> Require all granted </If> <Else> Require all denied </Else> </Location>
Ich will aber nicht bei jedem API-Key ein Abschnitt schreiben... Ich würde lieber das in einer Datei speichern. Aber ich habe keine Ahnung, wie ich diese Daten aus einer Datei lesen kann...
Kann jemand mir helfen?
Du nutzt mit '=~' doch eine Regex-Abfrage. Da kannst du auch alle Schlüssel in den Regex-Ausdruck schreiben, ohne jeweils einen neuen Abschnitt schreiben zu müssen. Du kannst deinen Abschnitt sogar kürzen. Schau dir mal das 3. Beispiel unter https://httpd.apache.org/docs/2.4/de/expr.html und https://httpd.apache.org/docs/2.4/howto/access.html#env an.
Alternativ könnte man die file() Funktion vielleicht so nutzen (ungetestet):
<If "%{QUERY_STRING} =~ /key=(\d+)/"> Require expr file('keys.txt') =~ $0 </If>
Ich muss dazu sagen, ich weiß nicht, ob Apache hier die längste oder die kürzeste Übereinstimmung ausgibt. Bestimmte Regexe unterstützen die Notation mit einem Fragezeichen am Ende '(\d+?)', um die längste Übereinstimmung auszugeben. Das Problem erscheint mir, dass du ja den vollständigen Schlüssel brauchst, der dann in der Back-Referenz $0 gespeichert wird. Also eigentlich alles nach dem '=' und bevor ein weiterers Key-Value-Paar kommt (bestimmt getrennt durch '&') oder das Ende des Strings ('$'). So etwas wie:
/key=(\d+)[&$]/
Da kann ich dir leider nicht so sehr helfen.
Alternativ kannst du wahrscheinlich auch etwas mit mod_rewrite und RewriteMap basteln, wenn du die Schlüssel aus einer Datei auslesen möchtest.
HTH und Gruß, Daniel