Ich verwende einen GoDaddy-Webhosting-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).
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 einzuschrä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 einen 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, weil GoDaddy Apache nicht auf seinen Windows Servern ausführt.
Ich könnte die Dateien in BLOBs in der Datenbank einfügen, aber das wird sehr unordentlich, wenn ich schnell mit ihnen arbeiten muss (und ich hatte einige Probleme mit diesem Ansatz).
Irgendwelche Vorschläge, um den Zugriff auf die Dateien nur auf ein PHP-Skript (readfile ()) zu beschränken?
Da Sie die Dateien nirgendwo außer in Ihrem public_html-Verzeichnis ablegen können, müssen Sie sich für die gefürchtete / verhasste "security by obscurity" -Methode entscheiden
Erstellen Sie ein zufällig benanntes Unterverzeichnis zum Speichern der Dateien in: public_html / RANDOMGARBAGE
Stellen Sie sicher, dass das Verzeichnis nicht durchsuchbar ist. Deaktivieren Sie das Verzeichnis-Browsing (falls möglich), und legen Sie ein Standarddokument (index.html?) Ebenfalls dort ab. Selbst wenn das Browsen aktiviert ist, wird die Verzeichnisliste nicht angezeigt.
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 es nötig ist). Speichern Sie den ursprünglichen Dateinamen in Ihrer Datenbank. Du hast also etwas wie:
public_html/RANDOMGARBAGE/5bf1fd927dfb8679496a2e6cf00cbe50c1c87145
public_html/RANDOMGARBAGE/7ec1f0eb9119d48eb6a3176ca47380c6496304c8
Dienen die Dateien über ein PHP-Skript - niemals direkt mit dem Hash-Dateinamen verlinken
Herunterladen
was dann geschieht:
%Vor% Auf diese Weise wird der Benutzer niemals sehen, was Ihr "s00per seekrit" -Dateiname ist, er sieht nur, dass sein Browser ...php?fileID=37
erreicht und startet einen Download von secret file.pdf
Darüber hinaus können Sie gelegentlich das spezielle Unterverzeichnis regelmäßig in etwas anderes umbenennen und den Salt-Text ändern (der dann die Aktualisierung aller Hash-Dateinamen mit den neuen sha1-Werten erfordert).
Da PHP die Berechtigungen des Webserver-Benutzers verwendet, gibt es keine Möglichkeit, den Zugriff auf die Dateien zu beschränken, ohne:
Das Einfügen in eine Datenbank gilt als außerhalb von 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, sich mit GoDaddy in Verbindung zu setzen, um zu sehen, ob es eine Möglichkeit gibt, Dateiberechtigungen pro Verzeichnis zu konfigurieren.
Sie können sie einfach ausblenden. Es ist Sicherheit durch Obskurität, 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 sie diese nicht direkt bedienen sollen.
Also kleben Sie sie in ein zufällig benanntes Verzeichnis:
%Vor%Schreiben Sie sich dann ein kleines PHP-Skript, das entsprechende Header sendet und den Dateiinhalt durchgibt.
zum Beispiel:
%Vor%Nun, das obige ist wirklich nicht besser, als nur die Dateien direkt (noch) zu bedienen, da die Leute den id-Parameter immer noch in der Abfragezeichenfolge erhöhen können.
Aber Sie sollten in der Lage sein, herauszufinden, wie mit Autorisierung ziemlich leicht umzugehen.
Machen Sie einen Ordner Web nicht zugä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 eingestellt, IE-Benutzer und -Gruppe können lesen / schreiben / ausführen, andere können nichts tun.