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


Antwort per Email an