Frage

Ich verwende eine GoDaddy Web-Plan-Plattform auf einer Windows-Hosting. Das war nicht meine Wahl - es hat mit einem anderen Teil der eigentlichen Website zu tun ASP.NET verwenden (auch nicht meine Wahl).

Ich habe eine SQL-Datenbank mit einem Bündel von Einträgen mit einigen nicht-sensible Kundendaten. Der Primärschlüssel dazu ist eine AutoIncrement ganze Zahl ist, und ich habe eine Reihe von PDF-Dateien, die mit jedem dieser ganzen Zahlen übereinstimmen (z 555.pdf, 7891.pdf, etc).

Mein Ziel ist der direkte Zugriff auf diese Dateien zu beschränken, möchte ich Benutzer durch eine Suche und Anmeldevorgang muss gehen (PHP) zuerst. Ursprünglich wollte ich die Dateien über den public_html Ordner setzen, aber GoDaddy weigert sich, mich zu geben, Root-Zugriff, ohne einen dedizierten Server ($ 20 pro Monat von ihnen).

Das nächste, was ich sah in war HTACCESS. Ich wollte nur den Zugriff auf die Dateien zugreifen, um nur PHP-Skripte beschränken erlaubt den IP-Adresse des Servers (oder localhost / 127.0.0.1). Leider Arbeit tut dies nicht, weil GoDaddy Apache nicht auf seinen Windows-Servern ausgeführt werden.

ich die Dateien in BLOBs in der Datenbank setzen konnte, aber das wird wirklich chaotisch, wenn ich zur Arbeit muß mit ihnen schnell (plus Ich habe einige Probleme mit diesem Ansatz habe).

Irgendwelche Vorschläge zu einem PHP-Skript (Readfile ()) nur Zugriff auf die Dateien zu beschränken?

War es hilfreich?

Lösung

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

  1. Erstellen Sie eine zufällig benannte Unterverzeichnis der Dateien in speichern: public_html / RANDOMGARBAGE

  2. Stellen Sie sicher, dass das Verzeichnis nicht durchsuchbar. Deaktivieren Sie die Verzeichnissuche (wenn Sie können), und ein Standarddokument setzen (index.html?) In auch dort, so dass selbst wenn das Surfen ist, werden Sie nicht das Verzeichnis erhalten auflistet.

  3. Speichern Sie nicht Ihre Dateien mit erratbar Namen. Anstatt sie mit der Datenbank-ID zu speichern, speichern Sie sie mit einem gesalzenen + Hash-Namen statt: $crypted_filename = sha1($real_filename . 'some hard-to-guess salt text'); (natürlich macht dies komplexe, wenn Sie benötigen). Bewahren Sie den ursprünglichen Dateinamen in Ihrer Datenbank. So können Sie mit so etwas wie am Ende:

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

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

    Download

, die dann tut:

<?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");
    }

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

starten

Am Anfang dieser, kann man gelegentlich den speziellen Unterverzeichnis, um etwas umbenennen sonst auf einer regelmäßigen Basis, sowie die Salz Text ändern (was dann erfordert, dass Sie alle die Hash-Dateinamen mit den neuen SHA1-Werte aktualisieren).

Andere Tipps

Sie können einfach, sie verstecken. Es ist sicherheits durch Dunkel, aber es wie die beste Wahl klingt, wenn man nicht entweder kann sie von dem Web-root draußen bleiben, oder einen Weg finden, um dem Server zu sagen, sie nicht direkt zu dienen.

klebe sie also in einigen zufällig benannte Verzeichnis:

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

Dann schreiben Sie sich ein wenig PHP-Skript, das entsprechende Header senden, und übergeben Sie den Inhalt der Datei durch.

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 ist die oben 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 sollen in der Lage sein, herauszufinden, wie Berechtigung zu handhaben ziemlich leicht.

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

  • sie außerhalb des DOCROOT platzieren
  • Ändern der Web-Server-Konfiguration nicht zulassen Zugriff auf diese Dateien
  • Ändern der Datei, so wird es vom Webserver interpretiert werden, so dass sein Inhalt versteckt

in einer Datenbank gilt als außerhalb der DOCROOT Putting. Für die dritte Option, können Sie die PDF-Dateien PHP-Dateien machen, aber ehrlich gesagt, das ist ziemlich verworren würde.

Ich empfehle Sie GoDaddy kontaktieren und sehen, ob sie irgendeine Art und Weise zu konfigurieren pro-Verzeichnis-Dateiberechtigungen haben.

Machen Sie einen Ordner Web unzugänglichen über chmod. PHP in der Lage, noch enthalten / erfordern, was auf dem Server ist, aber die Benutzer nicht in der Lage sein, immer auf die Dateien zu navigieren.

Beispiel: Dies ist auf 770 IE Benutzer- und Gruppen lesen können / Schreiben / Ausführen, andere können nichts tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top