2012-04-04 6 views
1

Mit PHP, ich entwickle ein Skript, das einen Vertrag generiert, sobald das Skript validiert ist.Begrenzen Sie den Zugriff auf PDF-Seite mit PHP

Der Vertrag ist ein PDF-Dokument mit TCPDF generiert und ich speichern es auf dem Server in einem Unterverzeichnis mit der Benutzer-ID. Zum Beispiel wäre 'contracts/132/1.pdf' die Rechnung # 1 des Benutzers mit ID 132.

Ich möchte jedoch nur Benutzer 132 in der Lage sein, auf diese Datei zuzugreifen, weil sie persönliche Informationen enthält. Wie kann ich den Zugriff auf PDF-Dokumente in jedem Unterordner auf den jeweiligen Benutzer beschränken (mit php oder htaccess, was am besten funktioniert - ich bin mit htaccess nicht vertraut)?

Antwort

2

Der einfachste Weg, nur ist wahrscheinlich ein PHP-Skript zu haben, die die Existenz einer gültigen Session erfordert (wie der Generator Skript der Fall ist), dessen Funktion readfile("/path/to/contract.pdf"); ist

Auf diese Weise können Sie Ihre PDF-Wrapper-Skript haben Überprüfen Sie, ob der heruntergeladene Vertrag der RICHTIGE Vertrag für die Person in der Sitzung ist, nicht nur, dass es sich um einen Vertrag handelt, der sich im Verzeichnis befindet.

Das Problem mit einer .htaccess-basierten Lösung für das Verzeichnis besteht darin, dass jeder mit Lesezugriff auf das Verzeichnis ALLE Verträge herunterladen kann.

eine URL wie http://example.com/contract.php?user=132&bill=1 Angenommen, Sie könnten:

<?php 

$user = $_GET['user']; 
$bill = $_GET['bill']; 
# do input validation on $user and $bill. No really, do it. 

if ($user != $_SESSION['user']) { 
    die("Security error; the black choppers are on their way."); 
} 

header("Content-type: application/pdf"); 
header('Content-Disposition: attachment; filename="Contract-$user-$bill.pdf"'); 

readfile("/path/to/pdfspool/$user/Contract-$user-$bill.pdf"); 

Die if() Brocken in der Mitte überprüft, ob der Benutzer $ ist für den aktuellen Benutzer gültig angefordert wird. Offensichtlich sollten Sie $ _SESSION ['user'] speichern, wahrscheinlich, wenn sich dieser Benutzer zum ersten Mal anmeldet.

Natürlich müssen Sie die Spooldateien nicht wirklich speichern. Wenn der Prozess der Erstellung einer PDF-Datei Ihren Webserver nicht überfordert (und wenn Sie andere Probleme haben), ist es möglicherweise einfacher, jede PDF-Datei auf Anfrage neu zu erstellen. Das mache ich jetzt mit Unternehmensrechnungen, und jede Rechnung erhält eine 6-Punkt-Fußzeile, die sagt, wann sie generiert wurde und auf welche Anfrage von welcher IP-Adresse. :)

+0

Was ist, wenn der Benutzer klug genug ist, die direkte URL zum PDF-Skript in die Adressleiste einzugeben? Geben Sie beispielsweise www.mysite.com/contracts/124/5.pdf ein. –

+0

Aktualisiert. Ich habe dem Code einen Abschnitt hinzugefügt, der $ user gegen eine Sitzungsvariable validiert. – ghoti

2

Zunächst würden Sie die PDF-Dateien außerhalb des Webstamms der Site platzieren und sie über ein Skript abrufen.

Dies kann durch die Kombination einer Regel Mod_Rewrite gemacht nahtlose werden, die Anforderungen an geht, wo die PDF-Dateien aus, um ein PHP-Skript abgerufen werden würde, die Benutzer und Dokument-IDs aus der URL wird und führt eine Steuerung Zugang, die, wenn sie erfolgreich ist, gibt die Dateiinhalte.

Weitere Informationen zur HTTP-Level-Authentifizierung mit PHP-Code finden Sie unter the PHP Manual.

+0

Was meinen Sie mit "plazieren Sie die PDF-Dateien außerhalb des Webstamms der Website"? Kannst du es an einem Beispiel illustrieren? –

+0

Wenn sich Ihr Webstamm unter '/ home/user/public_html' befindet, legen Sie die Dateien in'/home/user/pdfs' ab. Solange PHP aus dem Inhalt des Verzeichnisses "/ home/user/pdfs" lesen kann, kann es den Inhalt der Dateien abrufen, aber sie sind nicht direkt aus dem Internet zugänglich. – Ariel

+0

Danke, daran hatte ich nicht gedacht - weise Idee. –

Verwandte Themen