» Start & Installation » ASP-Grundlagen » VBScript » Datenbanken » Erweiterte Techniken » Fehlercode-Suche » FAQ » Forum für aspfehlercodes » ASP » JavaScript » ASCII & ANSI » HTTP-Statuscodes » Codepage » LCID » VBScript » JScript
|
Link: Wichtiger Hinweis in eigener Sache!
| Autor: Klaus Keller | Erstellt am: 2004-09-06 | Aufrufe: 10668 |
Tipp 67: Verzeichnisschutz im Eigenbau
Wie schafft man es, daß Dateien nur für bestimmte Besucher zugänglich sind? In diesem Tipp geht es nicht darum, einzelne ASP-Seiten zu schützen, sondern Dateien zum Download für bestimmte Benutzer zur Verfügung zu stellen. In Tipp 59: Verzeichnisschutz per Basic Authentication ging es darum, beim Aufruf einer ASP-Seite, die ausgeführt werden soll, nur vorbestimmte Besucher zuzulassen. Dieser Tipp hat ein anderes Ziel: Besucher "XY" darf nur dann eine Datei herunterladen, wenn dieser dafür berechtigt ist, also eine Art "Verzeichnis-Download-Schutz". Im Unterschied zu Basic-Authentication aus Tipp 59 ist dafür jedoch keine Einstellung am Server notwendig, die viele Webhoster ablehnen.
Der Grundansatz ist hierfür bereits in Tipp 40: Datenbank vor dem herunterladen schützen beschrieben. Kurz zur Erläuterung: Wenn man eine Datenbank in ASP einsetzt die sich im wwwroot-Verzeichnis befindet, kann diese ohne die richtigen Einstellungen von einem Besucher ganz einfach heruntergeladen werden. Mit den richtigen Einstellung wird das jedoch unterbunden. In ASP bzw. dem IIS gibt es 2 hierfür interessante Zugriffsrechte: Die Webfreigabe und die Ihnen sicherlich bekannten Zugriffsrechte auf Dateienebene. Um den Download der Datenbank zu verhindern wird die Webfreigabe entfernt und für Zugriffe auf Dateienebene wird dem IUSR_PCName ein Änderungsrecht eingeräumt.
Genau das ist auch der Ansatz beim hier beschriebenen Verzeichnisschutz. Wenn man für ein Verzeichnis eine Webfreigabe entfernt ist ein Zugriff durch einen Besucher nicht mehr möglich. Die dann einzigen Möglichkeiten sind dann (wenn entsprechend eingestellt) per FTP oder per ASP-Skript. Möchte ein Besucher nun eine Datei herunterladen wird diese per ASP-Skript ausgelesen und an den Client gesandt.
Natürlich könnte man jetzt einwenden: Was ist, wenn der Webhoster die Webfreigabe nicht entfernen möchte? Wenn der Webhoster sagt, überhaupt keine Änderung? Da der Besucher den Pfad zur Datei nie zu sehen bekommt, wird dieser auch das Verzeichnis kaum aufrufen. Somit besteht eine hohe Sicherheit, allerdings keine absolute. Meine Empfehlung lautet: Erstellen Sie ein Verzeichnis dafür, zum Beispiel mit dem Namen "~Secure_Download", und bitten Sie den Webhoster um die gleichen Sicherheitseinstellungen wie bei einem Datenbank-Verzeichnis. Viele Webhoster sind nicht gerade begeistert wenn man extra-Dinge haben möchte, auch schon wegen der Sicherheit. Aber mit "~Secure_Download" und den auch dem Webhoster bekannten Zugriffseinstellungen erhöhen Sie die Chance für eine Anpassung durch den Webhoster.
Aber selbst wenn der Webhoster beharrlich nein sagt erhöhen Sie dennoch die Sicherheit für Ihre Dateien. Die Möglichkeit, daß der Besucher den Verzeichnis-Namen tatsächlich erfährt ist eher gering, und zwar nur dann, wenn ein Fehler im ASP-Skript auftritt, welches den Download durchführt.
Nun stellt sich die Frage, wie kann man eine Datei vom Server zum Client senden. Es gibt hierfür mehrere Möglichkeiten, zum einen mit einer am Server zu installierenden Komponente und mit reinem ASP-Skript. Vorteil der Komponente: Deutlich schneller. Und viele Webhoster werden derartige Komponenten schon installiert haben, wenn nicht fragen Sie Ihren Webhoster danach. Vorteil des ASP-Skripts: Keine Extrainstallationen, aber nur für kleinere Dateien geeignet, bei einer grösseren Datei kann das Senden der Datei zum Client um ein Vielfaches länger dauern also wie bei einer Komponente, auch kann der Server deutlich beansprucht werden. Daher: Nur für kleine Dateien geeignet!
Nur: Wie funktioniert das mit dem Auslesen und dem Senden per ASP-Skript an den Client? Das Skript hierzu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| <% Dim DocDatei, ContType, FileExt, stream
Const adTypeBinary = 1 DocDatei = "Test.pdf" DocPath = "C:\Inetpub\wwwroot\"
'Dateierweiterung auslesen. FileExt = LCase(Right(Datei,len(Datei)-instrrev(Datei,".",-1)))
'Datei als Attachment senden, "Speichern unter.."? Response.AddHeader "Content-Disposition","attachment;filename=" & DocDatei 'falls darstellen, z.B. als Bild. 'Response.AddHeader "Content-Disposition","inline;filename=" & DocDatei
Response.ContentType = GetFileExt(FileExt)
'ADODB-Stream erzeugen. Set stream = Server.CreateObject("ADODB.Stream") stream.Type=adTypeBinary stream.open
'Datei lesen und ausgeben, angegeben werden muss der komplette Pfad! stream.LoadFromFile(DocPath & DocDatei) Response.BinaryWrite Stream.Read(stream.Size) stream.close set stream = nothing
'Welcher Contenttype? Falls es noch andere Dateitypen gibt, diese hier angeben 'Falls der genaue Contenttype nicht bekannt ist, in der Registry kann man diesen 'auslesen: Unter HKEY_CLASSES_ROOT einfach die Dateierweiterung suchen, darauf 'klicken, im rechten Fenster ist ein Wert, diesen kopieren und hier einfügen. 'Wichtig hierbei: In Case "asp" nur Kleinbuchstaben, da sonst die entsprechende 'Dateierweiterung nicht gefunden wird. Public Function GetFileExt(ByRef FileExt) Select Case FileExt Case "asp" ContType = "text/asp" Case "doc", "dot" ContType = "application/msword" Case "gif", "jpg", "jpeg", "tif", "gif", "bmp" ContType = "image/" & FileExt Case "htm", "html" ContType = "text/html" Case "jpg" ContType = "image/pjpeg" Case "mdb" ContType = "application/msaccess" Case "pdf" ContType = "application/pdf" Case "ppt" ContType = "application/vnd.ms-powerpoint" Case "rar", "wrar" ContType = "application/x-rar-compressed" Case "xls", "xlt" ContType = "application/vnd.ms-excel" Case "zip" ContType = "application/x-zip-compressed" Case "js", "vbs" ContType = "text/plain" Case "xml" ContType = "text/xml" Case Else ContType = "unknown/unknown" End Select End Function %> |
Mit diesem Skript wird die Datei an den Client gesandt, normalerweise sollte das Fenster "Speichern unter..." angezeigt werden. Leider funktioniert das nicht immer zuverlässig. Daher sollten Sie dem Besucher eine Erklärung anzeigen, daß dieser per Rechtsklick auf den Link klicken soll, und dann "Speicher unter" auswählen soll. Das ist (leider) nun mal die zuverlässigste Möglichkeit beim Client das Fenster "Speichern unter.." zu erhalten.
|
|