.htaccess und PDF-Dateien vertragen sich nicht
Bernd
- programmiertechnik
Hallo Leute,
seit einiger Zeit versuche ich vergeblich eine Lösung für folgendes Problem zu finden:
Ich möchte in einem bestimmten Verzeichnis (z.B. /down_pdf/) einige PDF-Dateien zum Download anbieten. Dieses Verzeichnis ist mit einem Backdoorschutz mittels .htaccess geschützt. D.h durch eine Refererprüfung ist ein direkter Aufruf des Verzeichnisses von Außen nicht möglich der Besucher wird automatisch zur Startseite weiter geleitet. Nur mein eigene Server (Domain) hat über ein cgi-Script eine Zugriffsberechtigung auf die enthaltenen Dateien. Die Funktion des Backdoorschutzes habe ich getestet und ist ok.
Die .htacces im Verzeichnis /down_pdf/ hat folgenden Inhalt:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://meineDomain.de/ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.meineDomain.de/ [NC]
RewriteRule /* http://www.meineDomain.de/index.html [R,L]
Das cgi-Script gibt eine HTML-Seite mit einer Linkliste der vorhandenen PDF-Dateien an dem aufrufenden Browser zurück. Einer dieser Links sieht wie folgt aus:
...
print "<a href="http://www.meineDomain.de/down_pdf/test.pdf">TEST.PDF</a><br>\n";
...
Mit dieser Konstruktion entsteht nun folgendes Problem:
Sobald der Browser den Acrobat-Reader öffnet und dieser die PDF-Datei zur Anzeige bringen möchte erscheint die Fehlermeldung "Datei beginnt nicht mit %PDF-"
Ein Word-Document wie z.B. test.doc oder andere beliebige Dateien werden ohne Probleme geladen.
Der Fehler verschwindet auch, sobald die .htacces durch umbenennen oder löschen nicht mehr vorhanden ist.
Ein ähnliches Problem gibt es laut Adobe-Support http://www.adobe.de/support/toptech/acrobat/319294/mein.html
In Verbindung mit angehängten PDF-Dateien bei E-Mails die über AOL versendet werden.
Über einen Tipp wie dieser Fehler behoben werden kann würde ich mich freuen!
Danke, und viele Grüße
Bernd
Moin!
Ich möchte in einem bestimmten Verzeichnis (z.B. /down_pdf/) einige PDF-Dateien zum Download anbieten. Dieses Verzeichnis ist mit einem Backdoorschutz mittels .htaccess geschützt. D.h durch eine Refererprüfung ist ein direkter Aufruf des Verzeichnisses von Außen nicht möglich der Besucher wird automatisch zur Startseite weiter geleitet. Nur mein eigene Server (Domain) hat über ein cgi-Script eine Zugriffsberechtigung auf die enthaltenen Dateien. Die Funktion des Backdoorschutzes habe ich getestet und ist ok.
Die .htacces im Verzeichnis /down_pdf/ hat folgenden Inhalt:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://meineDomain.de/ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.meineDomain.de/ [NC]
RewriteRule /* http://www.meineDomain.de/index.html [R,L]
Auf diese Weise schließt du alle Programme und Benutzer aus, die keinen Referrer senden.
Dein Ansatz ist äußerst fragwürdig. Es ist nirgendwo im HTTP-Standard vorgesehen, dass eine Ressource nur dann abgerufen werden darf, wenn sie einen "richtigen" Referrer sendet. Insofern kann es durchaus sein, dass der Acrobat Reader Probleme macht, weil er vielleicht ebenfalls als HTTP-Client auftritt (vielleicht als Plugin im Browser), aber eben keinen Referrer sendet.
Über einen Tipp wie dieser Fehler behoben werden kann würde ich mich freuen!
Naja, ich denke, der Ansatz ist klar: Lass den Müll mit dem Referrer-Checken, und alles wird gut. Manche Besucher können sich nicht aussuchen, ob und welchen Referrer sie schicken. Sie schicken entweder gar keinen (der Proxy filtert z.B. die Angabe raus, weil der Admin das so will), oder der Referrer entspricht immer der URL (was immerhin den Zugriff erlauben würde - aber auch dann, wenn man von ganz woanders kommt). Jedenfalls ist äußerst schlecht, dass sein System dann schlicht und einfach auf eine andere Seite umleitet, ohne zu vermelden, was falsch ist. Dann hat man nämlich gar keine Chance, vielleicht doch noch an die PDF-Datei zu kommen - du schneidest dir selbst ins eigene Fleisch, weil du nur einen Haufen "broken links" anbietest.
- Sven Rautenberg
Hallo Sven,
vielen Dank für Deine schnelle Antwort.
Der von mir gewählte Ansatz hat einen nicht zu verachtenden Sicherheitsaspekt.
Hintergrund ist folgender:
Die PDF-Dateien sind z.B. innerbetriebliche Dokumente die nur durch autorisierte User erreichbar sein dürfen. Das beschriebene cgi-Script welches die Linkliste erzeugt, prüft vorher die Autorisierung des Users.
Das die entsprechende Resource nur dann aufgerufen werden kann wenn ein korrekter Referer gesendet wird ist von mir gewollt!
Mein Gedanke war, dass das cgi-Script den Rferer sendet.
Ich habe auch schon versucht eine PDF-Datei mit einem cgi-Script byteweise einzulesen und diese dann an den Browser zu senden:
print "Content-type: application/pdf\n\n";
$filename = "../../down_pdf/test.pdf";
open (FILE,"< $filename");
while(<FILE>)
{
print $_;
}
close (FILE);
Aber auch hier entsteht das gleiche Problem!
Einen zusätzlichen Passwortschutz mittels .htaccess für das betroffene Verzeichnis möchte ich gerne vermeiden da doppelter Verwaltungsaufwand entsteht.
Vielen Dank
Bernd
Yo!
Der von mir gewählte Ansatz hat einen nicht zu verachtenden Sicherheitsaspekt.
Ähm... nein!
Hintergrund ist folgender:
Die PDF-Dateien sind z.B. innerbetriebliche Dokumente die nur durch autorisierte User erreichbar sein dürfen. Das beschriebene cgi-Script welches die Linkliste erzeugt, prüft vorher die Autorisierung des Users.
Gut. Damit erreichst du, dass nur autorisierte Benutzer die jeweilige Linkliste sehen. _Mehr nicht._
Das die entsprechende Resource nur dann aufgerufen werden kann wenn ein korrekter Referer gesendet wird ist von mir gewollt!
Mein Gedanke war, dass das cgi-Script den Referer sendet.
Das kann es tun - muss sich dann aber als Client mit dem eigenen Webserver verbinden - und das Dokument ist immer noch nicht beim User.
Ich habe auch schon versucht eine PDF-Datei mit einem cgi-Script byteweise einzulesen und diese dann an den Browser zu senden:
print "Content-type: application/pdf\n\n";
$filename = "../../down_pdf/test.pdf";
open (FILE,"< $filename");
while(<FILE>)
{
print $_;
}
close (FILE);
Aber auch hier entsteht das gleiche Problem!
Dieser Ansatz ist eigentlich der sinnvollste: Das Skript prüft die Autorisation und gibt dann die Datei aus.
Einen zusätzlichen Passwortschutz mittels .htaccess für das betroffene Verzeichnis möchte ich gerne vermeiden da doppelter Verwaltungsaufwand entsteht.
Deine Methode via Referrer ist nicht sicher. Insofern bleibt dir nichts anderes übrig, als dir etwas anderes auszudenken.
Es gibt noch wesentlich mehr Möglichkeiten, bei .htaccess die Benutzerkennung zu prüfen. Auch datenbankgestützte Methoden sind möglich. Schau dazu am besten mal bei der Doku deines Webservers rein.
- Sven Rautenberg