htaccess schließt eine URL von Basic Auth aus


79

Ich muss eine URL (oder noch besser ein Präfix) vom normalen htaccess Basic Auth-Schutz ausschließen. So etwas wie /callbacks/myBankoder /callbacks/.* Hast du irgendwelche Tipps, wie es geht?

Was ich nicht suche, ist, wie man eine Datei ausschließt. Dies muss eine URL sein (da dies eine Lösung ist, die auf dem PHP-Framework basiert und alle URLs mit mod_rewritean umgeleitet werden index.php). Es gibt also keine Datei unter dieser URL. Nichts.

Einige dieser URLs sind nur Rückrufe von anderen Diensten (keine IP ist nicht bekannt, daher kann ich sie nicht aufgrund der IP ausschließen) und sie können nicht nach Benutzer / Passwort fragen.

Die aktuelle Definition ist so einfach wie:

AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user 

Antworten:


59

Wenn Sie Apache 2.4 verwenden SetEnvIfund mod_rewrite-Problemumgehungen nicht mehr erforderlich sind, da die RequireDirektive Ausdrücke direkt interpretieren kann:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user

Apache 2.4 behandelt RequireAnweisungen, die nicht so gruppiert sind, <RequireAll>als wären sie in einer <RequireAny>Anweisung, die sich wie eine "oder" -Anweisung verhält. Hier ist ein komplizierteres Beispiel, das zeigt, wie sowohl der Anforderungs-URI als auch die Abfragezeichenfolge miteinander abgeglichen werden und auf die Anforderung eines gültigen Benutzers zurückgegriffen wird:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr %{QUERY_STRING} = 'secret_var=42'
    </RequireAll>

    Require valid-user
</RequireAny>

Dieses Beispiel würde den Zugriff auf ermöglichen /callbacks/foo?secret_var=42, erfordert jedoch einen Benutzernamen und ein Kennwort für /callbacks/foo.

Denken Sie daran, dass <RequireAll>Apache , sofern Sie nicht verwenden , versucht, die einzelnen Bedingungen in der richtigen Require Reihenfolge abzugleichen. Überlegen Sie sich daher, welche Bedingungen Sie zuerst zulassen möchten.

Die Referenz für die RequireRichtlinie finden Sie hier: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

Die exprReferenz zu ession finden Sie hier: https://httpd.apache.org/docs/2.4/expr.html


3
Ich musste die doppelten Anführungszeichen um den Require-Ausdruck entfernen, damit er auf Apache 2.4.7 funktioniert. Davon abgesehen hat es perfekt funktioniert.
Scott Smith

Ich musste auch die doppelten Anführungszeichen entfernen, aber es funktionierte perfekt.
TMPilot

1
Funktioniert nicht auf meiner Apache 2.4.10 / cakephp 3-Installation. Ich möchte / rest ausschließen, was ein virtueller Pfad ist (Umschreiberegel). Ich kann nicht herausfinden, warum es nicht funktioniert.
Stephan Richter

3
@ stephan-richter Ich vermute, weil der %{REQUEST_URI}Wert die umgeschriebene Zeichenfolge ist. Für Cake 3 ist das so ziemlich immer so /webroot/index.php. Möglicherweise müssen Sie einen alternativen Ansatz finden, z. B. die Verwendung von Cake selbst für die Authentifizierung von Routen.
Beporter

Du hast recht. Postete eine Frage zu diesem Thema und fand die Antwort selbst: stackoverflow.com/questions/41077895/…
Stephan Richter

85

Mit SetEnvIf können Sie eine Variable erstellen, wenn die Anforderung mit einem Pfad beginnt, und dann die Satisfy AnyAnweisung verwenden, um zu vermeiden, dass Sie sich anmelden müssen.

# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1

# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd

# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth

Der Zulassungs- / Verweigerungsblock von Anweisungen besagt, dass der Zugriff für JEDEN verweigert wird , außer wenn ein gültiger Benutzer vorhanden ist (erfolgreiche BASIC-Authentifizierungsanmeldung) oder wenn die noauthVariable festgelegt ist.


Ich habe diesen Abschnitt in <VirtualHost *: 80> DocumentRoot / var / www / Symfony / web / <Verzeichnis / var / www // Symfony / web> hinzugefügt, aber er funktioniert nicht.
Vishal

Könnten Sie bitte erklären, warum <Dateien> hier nicht funktioniert?
Asdmin

1
Vielen Dank! Hat mir wirklich geholfen, sei vorsichtig mit dem Fall - ich hatte Order deny,allowund es würde nicht funktionieren. Unnötig zu sagen, sehr frustrierend!
James F

2
Möglicherweise ist eine Allow from env=REDIRECT_noauthzum Umschreiben von URLs erforderlich. Könnte das Problem mit @vishal gewesen sein. Schauen Sie hier: [ stackoverflow.com/a/41092497/1285585]
Stephan Richter

2
Ich brauche beide Zeilen Allow from env=noauthund Allow from env=REDIRECT_noauthdamit es funktioniert.
CDuv

6

Diese Lösung funktioniert ziemlich gut. Sie müssen nur die Whitelist definieren, die Sie durchlaufen möchten.

SetEnvIfNoCase Request_URI "^/status\.php" noauth

AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user

Order Deny,Allow
Deny from all
Allow from env=noauth

Satisfy any

4

Ich habe die anderen Lösungen ausprobiert, aber das hat bei mir funktioniert. Hoffentlich hilft es anderen.

# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file

SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any

Dadurch können die API-URL und alle nachfolgenden URL-Zeichenfolgen /index.php/api/geöffnet werden, ohne dass Sie sich anmelden müssen, und alles andere wird zur Anmeldung aufgefordert.

Beispiel:

mywebsite.com/index.php/apiwird geöffnet, ohne zur Anmeldung aufgefordert zu werden, mywebsite.com/index.php/api/soap/?wsdl=1wird geöffnet, ohne zur Anmeldung aufgefordert zu mywebsite.comwerden, wird zuerst zur Anmeldung aufgefordert


1
<location />
        SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/passwords/passwords
        Order Deny,Allow
        Satisfy any
        Deny from all
        Allow from env=REDIRECT_noauth
        Require user yournickname
</location>

0

Ein anderer Ansatz funktioniert so, wenn der Bereich, den Sie schützen, über ein monolithisches PHP-Skript verfügt, das alles steuert, wie z. B. Wordpress. Richten Sie die Authentifizierung mit in einem anderen Verzeichnis ein. Fügen Sie dort eine index.php ein, die ein Cookie auf den Pfad '/' setzt. Überprüfen Sie dann in Wordpress (zum Beispiel) das Cookie, umgehen Sie jedoch die Prüfung, ob $ _SERVER ['REQUEST_URI'] die ausgeschlossene URL ist.

Auf meiner gemeinsam genutzten Hosting-Plattform konnte RewriteRule keine Umgebungsvariable festlegen, die mit "Satisfy any" funktioniert.

Beachten Sie bei jedem Ansatz, dass die Seite, die Sie schützen, keine Bilder, Stylesheets usw. enthält, die eine Authentifizierungsanforderung auslösen, wenn die Seite selbst dies nicht tut.


0

Fügen Sie den folgenden Code zu Ihrer Root-htaccess-Datei hinzu und vergessen Sie nicht, Ihre Administrator-URL, die .htpasswd-Dateiseite, zu ändern.

<Files "admin.php">
        AuthName "Cron auth"
        AuthUserFile E:\wamp\www\mg\.htpasswd
        AuthType basic
        Require valid-user
    </Files>

Erstellen Sie eine .htpasswd-Datei in Ihrem Stammordner und fügen Sie unten den Benutzernamen und das Kennwort hinzu (legen Sie den Standardbenutzernamen fest: admin und das Kennwort: admin123).

admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.

Bitte lassen Sie mich wissen, wenn Sie noch Probleme haben.


0

Warum verwenden Sie Basic Auth nicht einfach so, wie es beabsichtigt war?

user:password@domain.com/callbacks/etc

1
Nun, weil a) niemand wirklich ™ Authentifizierungsdaten in der URI-Zeichenfolge haben möchte und b) weil es wahrscheinlich ist, dass OP nicht die Möglichkeit hat, den Anruf anzupassen (da er über Rückrufe von einer Bank spricht, gehe ich davon aus, dass er die nicht ändern kann Verhalten auf der Client-Seite)
frank42
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.