2010-08-12 13 views
8

Ich verwende einen GoDaddy Web-Hosting-Plan auf einer Windows-Plattform. Dies war nicht meine Wahl - es hat mit einem anderen Teil der tatsächlichen Website mit ASP.NET zu tun (auch nicht meine Wahl).Beschränken Sie den Dateizugriff - lesen Sie nur PHP

Ich habe eine SQL-Datenbank mit einer Reihe von Einträgen mit einigen nicht-sensiblen Kundeninformationen. Der Primärschlüssel hierfür ist eine AutoIncrement-Ganzzahl, und ich habe eine Reihe von PDF-Dateien, die mit jeder dieser Ganzzahlen übereinstimmen (z. B. 555.pdf, 7891.pdf, usw.).

Mein Ziel ist es, den direkten Zugriff auf diese Dateien zu beschränken. Ich möchte, dass Benutzer zuerst einen Such- und Login-Prozess (PHP) durchlaufen müssen. Ursprünglich plante ich, die Dateien über den PUBLIC_HTML-Ordner zu stellen, aber GoDaddy verweigert mir den Root-Zugriff ohne dedizierten Server ($ 20 pro Monat von ihnen).

Das nächste, was ich untersucht habe, war HTACCESS. Ich wollte den Zugriff auf die Dateien auf PHP-Skripte beschränken, indem ich nur den Zugriff auf die IP-Adresse des Servers (oder localhost/127.0.0.1) erlaubte. Leider funktioniert das nicht, da GoDaddy Apache nicht auf seinen Windows-Servern ausführt.

Ich könnte die Dateien in BLOBs in der Datenbank, aber das wird wirklich chaotisch, wenn ich schnell mit ihnen arbeiten muss (plus ich hatte einige Probleme mit diesem Ansatz).

Irgendwelche Vorschläge, um den Zugriff auf die Dateien nur auf ein PHP-Skript zu beschränken (readfile())?

+0

Das hängt von dem Webserver ab, den sie verwenden (IIS, angenommen). Vielleicht sollten Sie dies mit IIS kennzeichnen. – Artefacto

Antwort

5

Da Sie die Dateien nicht überall, aber in Ihrem public_html Verzeichnis setzen können, werden Sie „durch Verschleierung Sicherheit“ für die gefürchtete/gehasst gehen Methode

  1. erstellen zufällig benannte Unterverzeichnis Speichern Sie die Dateien in: public_html/RANDOMGARBAGE

  2. Stellen Sie sicher, dass das Verzeichnis nicht durchsuchbar ist. Deaktivieren Sie das Verzeichnis-Browsing (wenn Sie können), und legen Sie ein Standarddokument (index.html?) Auch dort ein, so dass Sie die Verzeichnisliste auch dann nicht erhalten, wenn Sie surfen.

  3. Speichern Sie Ihre Dateien nicht mit erratenen Namen. Anstatt sie mit der Datenbank-ID zu speichern, speichern Sie sie stattdessen mit einem gesalzenen + Hash-Namen: $crypted_filename = sha1($real_filename . 'some hard-to-guess salt text'); (machen Sie das natürlich komplizierter, wenn Sie es brauchen). Speichern Sie den ursprünglichen Dateinamen in Ihrer Datenbank. So können Sie am Ende mit etwas wie:

    public_html/RANDOMGARBAGE/5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 public_html/RANDOMGARBAGE/7ec1f0eb9119d48eb6a3176ca47380c6496304c8

  4. die Dateien über ein PHP-Skript Serve up - verknüpfen nie auf die Hash-Dateinamen direkt

    Herunterladen

die dann does:

<?php 

    $fileID = (int)$_GET['fileID']; 

    $crypted_file = sha1($fileID . 'some hard-to-guess salt text'); 

    $full_path = 'public_html/RANDOMGARBAGE/' . $crypted_file; 
    if (is_readable($full_path)) { 
     if(user_is_allowed_to_see_this_file()) { 
      /// send file to user with readfile() 
      header("Content-disposition: attachment; filename=$ORIGINAL_FILENAME"); 
      readfile($full_path); 
     } else { 
      die("Permission denied"); 
     } 
    } else { 
     /// handle problems here 
     die("Uh-oh. Can't find/read file"); 
    } 
der Benutzer

Auf diese Weise wird nie sehen, was Ihre „s00per seekrit“ Dateiname ist, werden sie nur ihren Browser ...php?fileID=37 schlagen sehen und einen Download von secret file.pdf

Auf dieses starten, kann man gelegentlich die besondere Unter umbenennen Verzeichnis zu etwas anderem in regelmäßigen Abständen, sowie ändern Sie die Salz-Text (die dann erfordert, aktualisieren Sie alle Hash-Dateinamen mit den neuen sha1 Werte).

0

Sie können sie einfach verstecken. Es ist Sicherheit - durch Unklarheit, aber es klingt wie Ihre beste Option, wenn Sie sie nicht aus dem Web-Root heraushalten können oder eine Möglichkeit finden, dem Server mitzuteilen, dass er sie nicht direkt bedienen soll.

klebt sie also in einigem zufällig benannte Verzeichnis:

asd8b8asd8327bh/123.pdf 
asd8b8asd8327bh/124.pdf 
asd8b8asd8327bh/125.pdf 
... 

dann selbst einen kleinen PHP-Skript schreiben, die entsprechenden Header senden, und die Dateiinhalte durchlaufen.

zum Beispiel:

<?PHP 
//pdf.php 
$id = $_GET['id']; 

//make sure nobody is doing anything sneaky. is_numeric() might do the trick if the IDs are always integers. 
if (!some_validation_passes($id)){ 
    die(); 
} 
<?php 

header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="'.$id.'.pdf"'); 
readfile('asd8b8asd8327bh'.$id.'pdf'); 

Nun, das oben ist wirklich nicht besser als nur die Dateien direkt Portion (noch) nicht, da die Menschen immer noch die ID-Parameter im Query-String erhöhen können.

Aber Sie sollten in der Lage sein, herauszufinden, wie mit Autorisierung ziemlich einfach umgehen.

+0

Dies ist Sicherheit durch Dunkelheit. Mit anderen Worten, nicht sicher. – Borealid

+0

@Borealid Du sagst das so, als ob ich meine Antwort in der ersten Zeile nicht explizit qualifiziert hätte. Nicht durch Sicherheit in eine Debatte über Sicherheit zu geraten, sondern "Das ist Software. Mit anderen Worten, nicht sicher". Oder "Dies ist ein Passwort-System und daher unsicher". In der Tat, jetzt, wo ich darüber nachdenke, ist meine Lösung ungefähr so ​​sicher wie ein starkes Passwort, wenn man davon ausgeht, dass ein Angreifer keine Verzeichnisse auflistet, die keinen Zusammenhang haben. – timdev

0

Machen Sie einen Ordner Web unzugänglich über Chmod. PHP wird immer noch in der Lage sein, alles, was auf dem Server ist, einzubinden, aber die Benutzer werden nicht in der Lage sein, zu den Dateien zu navigieren.

Beispiel: Dies ist auf 770 festgelegt, IE Benutzer und Gruppe kann lesen/schreiben/ausführen, andere können nichts tun.

+0

Diese Antwort ist falsch. Abgesehen von einer SuExec/CGI-Konfiguration verwendet PHP die Berechtigungen des Webservers. Wenn die Datei für den Webserver nicht zugänglich ist, ist sie auch für PHP nicht zugänglich. – Borealid

+0

Ich habe einen Ordner auf 770 eingestellt und kann ihn einbinden, kann aber nicht direkt in meinem Browser navigieren. – Robert

+0

Auch ich denke, Sie missverstanden, der Webserver hat immer noch Berechtigungen, Benutzer und Gruppe haben Berechtigungen in 770, andere nicht. Dies gibt PHP vollen Zugriff auf Dateien, Webbrowser wird nichts bekommen. – Robert

1

Da PHP die Web-Server-Benutzer-Berechtigungen verwendet, gibt es keine Möglichkeit, ohne Zugriff auf die Dateien zu beschränken entweder:

  • sie außerhalb des DOCROOT Platzierung
  • den Web-Server-Konfiguration ändern Zugriff auf diejenigen zu verbieten Dateien
  • Ändern der Datei, so wird es vom Webserver interpretiert werden, so dass sein Inhalt

Putting sie in einer Datenbank gilt als OUTSI versteckt de die DOCROOT. Für die dritte Option könnten Sie die PDFs zu PHP-Dateien machen, aber ehrlich gesagt wäre das ziemlich kompliziert.

Ich empfehle Ihnen Kontakt GoDaddy und sehen, ob sie eine Möglichkeit haben, pro-Verzeichnis Dateiberechtigungen zu konfigurieren.

+0

Clever. Angenommen, OP kann nichts mit dem Server tun, ich mag Ihre dritte Option, gekoppelt mit dem Basiscode, den ich skizziert habe. – timdev

Verwandte Themen