Hallo Leute!
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?
Danke Luca Bertoncello (lucabert@lucabert.de)
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
Am 29.11.2020 um 02:16 schrieb Daniel Leidert:
Hallo Daniel
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 habe so probiert. Leider geht es nicht... Apache spuckt den Fehler:
Cannot parse expression in require line: syntax error, unexpected T_REGEX_BACKREF, expecting T_REGEX or T_REGEX_I
Hast du eine Idee, wie man das umschreiben kann?
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
Das wäre gar kein Problem, denn ich kann problemlos alle API-Key mit derselben Länge schreiben
Alternativ kannst du wahrscheinlich auch etwas mit mod_rewrite und RewriteMap basteln, wenn du die Schlüssel aus einer Datei auslesen möchtest.
Das wäre auch eine Möglichkeit, allerdings weiß ich nicht genau, wie ich das machen kann... Hast du vielleicht ein Tipp, bzw. ein Beispiel?
Danke Luca Bertoncello (lucabert@lucabert.de)
Am Sonntag, den 29.11.2020, 08:25 +0100 schrieb Luca Bertoncello:
Am 29.11.2020 um 02:16 schrieb Daniel Leidert:
Hallo Daniel
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%C2%A0und https://httpd.apache.org/docs/2.4/howto/access.html#env%C2%A0an.
Alternativ könnte man die file() Funktion vielleicht so nutzen (ungetestet):
<If "%{QUERY_STRING} =~ /key=(\d+)/"> Require expr file('keys.txt') =~ $0
</If>
Ich habe so probiert. Leider geht es nicht... Apache spuckt den Fehler:
Cannot parse expression in require line: syntax error, unexpected T_REGEX_BACKREF, expecting T_REGEX or T_REGEX_I
Hast du eine Idee, wie man das umschreiben kann?
Kann sein, dass der Ausdruck in Anführungszeichen stehen muss. Also so:
Require expr "file('keys.txt') =~ $0"
[..]
Alternativ kannst du wahrscheinlich auch etwas mit mod_rewrite und RewriteMap basteln, wenn du die Schlüssel aus einer Datei auslesen möchtest.
Das wäre auch eine Möglichkeit, allerdings weiß ich nicht genau, wie ich das machen kann... Hast du vielleicht ein Tipp, bzw. ein Beispiel?
https://httpd.apache.org/docs/2.4/rewrite/rewritemap.html#txt
Nur eine Idee und ungetestet(!):
RewriteMap keys txt:/path/to/keys.txt RewriteCond %{QUERY_STRING} ! key= [NC,OR] RewriteCond %{QUERY_STRING} key=(\d+) [NC] RewriteCond ${keys:%1|NOT-ALLOWED} =NOT-ALLOWED RewriteRule ${REQUEST_URI} "-" [F,L]
Die Idee dahinter: Wenn kein Schlüssel übergeben wurde oder falls ein Schlüssel existiert und nicht in der Map enthalten ist (in Zeile 4 ist '%1' die Backref auf den Ausdruck in der Zeile davor, ALSO DEN sCHLÜSSEL), gib den Statuscode 403 zurück.
Ich habe jetzt auch gelesen, dass der reguläre Ausdruck in RewriteCond eine Perl-Regex ist. Dementsprechend könnte das in Zeile 3 funktionieren, um den längsten Treffer zu erhalten:
RewriteCond %{QUERY_STRING} key=(\d+?)
HTH und MfG Daniel
Am 01.12.2020 04:37, schrieb Daniel Leidert:
Hallo Daniel,
Kann sein, dass der Ausdruck in Anführungszeichen stehen muss. Also so:
Require expr "file('keys.txt') =~ $0"
Ich werde demnächst testen. Allerdings, da ich gestern feststellen musste, dass ich den Server hinten dem Proxy anderes einrichten muss, wird diese Apache-Konfiguration nicht mehr nötig.
Ich werde allerdings sehen, dass ich heute oder morgen das testen kann, falls jemand andere auch das Problem hat.
Grüße Luca Bertoncello (lucabert@lucabert.de)
Am Dienstag, den 01.12.2020, 08:04 +0100 schrieb Luca Bertoncello:
Am 01.12.2020 04:37, schrieb Daniel Leidert:
Hallo Daniel,
Kann sein, dass der Ausdruck in Anführungszeichen stehen muss. Also so:
Require expr "file('keys.txt') =~ $0"
Ich werde demnächst testen.
Da muss '$1' statt '$0' stehen, sehe ich gerade.
Guß, Daniel
lug-dd@mailman.schlittermann.de