it-swarm.com.de

Was ist der beste Ort zum Speichern von herunterladbaren PDF Rechnungen?

Meine Komponente erstellt Rechnungen im Format PDF), die Kunden herunterladen können.

Wo ist der beste Ort, um diese Dateien zu speichern?

/adminitrator/componentes/com_mycomponent/invoices

/componentes/com_mycomponent/invoices

/media/com_mycomponent/invoices

Wie kann ich verhindern, dass nicht autorisierte Benutzer diese Dateien direkt herunterladen?

Wie kann ich verhindern, dass Kunden die Rechnungen anderer Benutzer herunterladen?

7
Piero Marsilio

Ich würde davon abraten

administrator/components/com_mycomponent/invoices 

Dies liegt daran, dass es zu Problemen kommen kann, wenn Sie .htaccess In Ihrem Administratorverzeichnis verwenden. Zum Beispiel mit Akeeba Admin Tools

Ich würde es vorziehen, auch den Medienordner zu verwenden.

Sie können die Hash-Dateien auch wie folgt mit den richtigen ursprünglichen Namen versehen:

<?php
header("Content-type:application/pdf"); 

// It will be called Nice_TITLE.pdf
header("Content-Disposition:attachment;filename='Nice_TITLE.pdf'");

// The PDF source is in HASHED_FILE.pdf
readfile("HASHED_FILE.pdf");
?>

Dies beantwortet Ihre Frage möglicherweise nicht direkt, aber ich wollte zu dieser Frage einen anderen Standpunkt einnehmen.

Ich würde versuchen, Vermeiden Sie so viel wie möglich, Dokumente zu speichern, die Sie generieren können. Grund: Sie müssen sich für Ordnernamen/Dateinamen entscheiden, die später schwer zu ändern sind. Möglicherweise wird zu viel Speicherplatz verwendet und es können Sicherheitsprobleme auftreten.

Das hängt natürlich davon ab, wie Ihre Anwendung funktioniert, aber im Idealfall würde ich die Rechnungsdaten in Datenbanktabellen haben und bei Bedarf sofort Rechnungen erstellen.

Meine zwei Cent.

6
Valentin Despa

Ich dachte nur, ich würde meine 2 Cent einwerfen (einige gute Punkte beim Hashing des Dateinamens).

Ich hatte kürzlich ein ähnliches Problem. Anstatt mich um .htaccess Zu kümmern, speichere ich einfach die Dateien über public_html Mit einem Komponentenparameter, der den Pfad angibt, und verwende dann PHPs readfile, um die PDF abzurufen und auszugeben.

Funktioniert nicht mit allen Hosts, ist jedoch für die meisten Anwendungen relativ aufwändig und verhindert vollständig Hotlinking oder anderen Zugriff.

5
codinghands

Speichern Sie niemals benutzerdefinierte Dateien in den Komponentenverzeichnissen. Möglicherweise verlieren Sie sie während eines Updates Ihrer Komponente (wenn dies nicht ordnungsgemäß durchgeführt wird) oder wenn der Benutzer sie deinstalliert.

Der richtige Speicherort für solche Dateien ist der Ordner "images". Hier kann der Benutzer die Dateien mithilfe des Medienmanagers problemlos verwalten. Der "Medien" -Ordner wäre eine weitere sinnvolle Wahl, aber er ist eigentlich eher dazu gedacht, Erweiterungsressourcen wie CSS, JS und dergleichen zu speichern.

Wenn die Dateien jedoch sinnvolle Daten enthalten, die niemandem zur Verfügung stehen sollten, ist es eine schlechte Idee, sie in einem dieser Ordner zu speichern. Selbst wenn Sie sie haschen, können Sie sicher sein, dass irgendwann jemand sie lesen kann.

Wenn es sicher sein soll, speichern Sie die Datei entweder gar nicht und generieren Sie sie stattdessen dynamisch auf Anfrage. Oder speichern Sie es außerhalb von webroot und greifen Sie mit PHP darauf zu. Es gibt keinen anderen sicheren Weg.

3
Bakual

Das Verwenden des folgenden Verzeichnisses als Stammverzeichnis für alle Rechnungen ist in Ordnung:

administrator/components/com_mycomponent/invoices

Ich würde jedoch empfehlen, den Dateinamen zu haschen, sobald die Rechnung erstellt wurde. Wie so:

administrator/components/com_mycomponent/invoices/HASHED_FILE.pdf

Entweder das oder, für jede Rechnung, erstellen Sie ein Hash-Verzeichnis und speichern Sie das PDF dort wie folgt:

administrator/components/com_mycomponent/invoices/HASHED_DIR/file.pdf

pdate:

Wenn diese Methode ausgewählt ist, können Sie eine htaccess-Datei verwenden, um den direkten Zugriff zu verhindern und nur den PHP -gesteuerten Zugriff auf diese PDF -Dateien zuzulassen.

Für einen PHP -gesteuerten Download würde ich empfehlen, den Hash zusammen mit der ID des Benutzers in einer Datenbanktabelle zu speichern. Wenn Sie aufgefordert werden, die Datei herunterzuladen, können Sie die gespeicherte ID mit der ID des angemeldeten aktuellen Benutzers und natürlich mit dem in der Datenbank gespeicherten Hash abgleichen.

2
Lodder

Für mich ist der Medienordner am besten für diesen Zweck geeignet. Um den direkten Zugriff einzuschränken, erstellen Sie einfach eine .htaccess-Datei in Ihrem Ordner mit dem folgenden Inhalt.

DENY FROM ALL
2
Nagarjun