2016-04-11 35 views
1

Ich habe die folgende .htaccess-Datei in einem benutzerdefinierten Verzeichnis in Uploads Client genannt.Bypass .htaccess bei der Verwendung von download_url

RewriteEngine On 
RewriteCond %{HTTP_REFERER} !(www.)?example.co.uk/client-area* 
RewriteRule ^.*$ - [R=403,L] 
ErrorDocument 403 'http://www.example.co.uk/client-area/' 

Also, wenn jemand von irgendwo anders eine Datei im uploads/Client/Verzeichnis zuzugreifen versucht, als die Client-Bereich Seite, sie weitergeleitet.

Allerdings möchte ich dies ignorieren, wenn ich mit der WordPress-Funktion download_url auf eine Datei in diesem Verzeichnis innerhalb von functions.php zugreifen. Gibt es eine Neuschreibbedingung, die ich verwenden kann, um dies zu erleichtern?

+0

@anubhava 'download_url (http://www.example.co.uk/wp-content/uploads/client/example.pdf);' – BFWebAdmin

+0

Ist 'download_url' eine WP-Funktion? – anubhava

+1

Ja - https://developer.wordpress.org/reference/functions/download_url/ – BFWebAdmin

Antwort

0

Wenn ich es richtig verstehe Sie fordern eine WP-Funktion download_url und möchten diese Regel überspringen von 403.

Die Sache ist, dass Web-Server (Apache) wird nicht wissen, ob die Anfrage aufgrund Sie Aufruf download_url Funktion kommt.

Als Workaround müssen Sie einige Abfrageparameter übergeben, um mod_rewrite Regeln zu helfen, aber das ist kein sicherer Ansatz, da jeder Besucher Ihrer Website dasselbe auch tun kann, indem er denselben Abfrageparameter übergibt.

1

Sie können einen weiteren RewriteCond auf der QUERY_STRING Eigenschaft hinzufügen.

RewriteEngine On 
RewriteCond %{HTTP_REFERER} !(www.)?example.co.uk/client-area* 
RewriteCond %{QUERY_STRING} !^download_url [NC] 
RewriteRule ^.*$ - [R=403,L] 
ErrorDocument 403 'http://www.example.co.uk/client-area/' 

https://wiki.apache.org/httpd/RewriteQueryString

Edit: falsch verstanden habe ich die Frage. Ich dachte, Sie würden download_url in der URL übergeben. Sie können das gesamte Verzeichnis, in dem sich die herunterladbaren Dateien befinden, einfach von Ihrer RewriteRule ausschließen.

z.

RewriteEngine On 
RewriteCond %{HTTP_REFERER} !(www.)?example.co.uk/client-area* 
RewriteCond %{REQUEST_URI} !\/wp-content\/uploads\/((\.[^\.])|([a-z0-9\-_\+\/]))+$ [NC] 
RewriteRule ^.*$ - [R=403,L] 
ErrorDocument 403 'http://www.example.co.uk/client-area/' 

By the way, ich würde nicht wirklich auf HTTP_REFERER abhängen Inhalte zu filtern, kann es leicht durch den Kunden geändert/gefälscht werden. Die Regex in der RewriteCond, die ich hinzugefügt habe, wird Buchstaben, Zahlen, Bindestriche, Unterstriche, Plus und Vorwärts Schrägstriche übereinstimmen. Es passt nicht speziell "..". Dies soll verhindern, dass relative URIs auf andere Dateien außerhalb von wp-content/uploads zugreifen. (I denken Apache tatsächlich die URI erweitern und dann versuchen, den erweiterten URI gegen Ihre Regeln übereinstimmen.)

+0

Hiya, Angst, das tut immer noch nicht das, wonach ich suche - damit können alle Dokumente in diesem Ordner heruntergeladen werden; Ich möchte verhindern, dass alle Dateien in diesem Ordner heruntergeladen werden, außer *, wenn sie von dieser Seite oder über download_url heruntergeladen werden. Ich bin mir nicht sicher, ob das möglich ist, also verwende ich im Moment eine Abfragezeichenfolge. – BFWebAdmin

+0

@BFWebAdmin Wenn Sie 'download_url' verwenden, kopiert WP, sofern nicht anders angegeben, die Datei in das temporäre Verzeichnis, das von [get_temp_dir'] (https://developer.wordpress.org/reference/functions/get_temp_dir/#source-code) zurückgegeben wird).Wenn du die temporäre Datei nach einiger Zeit "ablaufst" und löschst und der Dateiname eindeutig ist (was genau ist), ist es besser, das temporäre Verzeichnis von deiner "RewriteRule" auszuschließen (wp-content/uploads in ersetzen) mein Beispiel). – noahnu

Verwandte Themen