2016-07-12 15 views
1

In meinem Projekt wird der Benutzer eine PDF-Datei hochladen. Das wird in einem Verzeichnis namens 'uploads' mit dem Namen $_SESSION['userId'].".pdf" gespeichert. Jetzt kann der Benutzer über die Datei 'myweb.com/uploads/id.pdf' auf die Datei zugreifen. Wenn der Benutzer jedoch den ID-Wert in der URL-Leiste des Browsers ändert, kann er auf die Datei eines anderen Benutzers zugreifen. Um dies zu verhindern, möchte ich ein Link verwenden, um ein $_SESSION['userId'] mit versteckten Typ auf der nächsten Seite zu senden. Auf der nächsten Seite wird mit der geposteten ID auf die Datei umgeleitet. Ist diese Idee in Ordnung? Oder gibt es bessere Lösungen?Erlaube Zugriff auf bestimmte Datei in PHP

+0

Nein. Weil es nicht hilft, wenn Sie es einfach vor der URL verstecken. Was passiert, wenn der Benutzer den Quellcode überprüft? Denken Sie über einen Ajax-Download nach, oder besser, wenn Sie ihm eine E-Mail schicken. – vaso123

+0

Check isset '$ _SESSION ['userId']' und vergleichen Sie das mit der ID in URL – Sree

+0

@Sree ja, das wäre meine nächste Suggestion, was ist offensichtlich :) – vaso123

Antwort

2

Sie erstellen müssen .htaccess-Datei und Platz folgenden zwei Zeilen In in den Ordner von PDF-Dateien in URL mit der ID vergleichen drin.

  • Bestellen Sie Ablehnen, Zulassen
  • von allen Deny

Diese .htaccess-Datei wird nicht jede PDF-Datei aus dem Browser direkt zugreifen können. Um die PDF-Datei für den angemeldeten Benutzer zugänglich zu machen, erstellen Sie eine PHP-Datei downloadpdf.php und fügen Sie den folgenden Code ein. Der angemeldete Benutzer kann seine Datei nur auf diese Weise herunterladen.

<?php 
$pdf_file = "{$_SERVER['DOCUMENT_ROOT']}/path-to-pdf-file/".$_SESSION['userId']".pdf"; 
if(file_exists($pdf_file)) 
{ 
    header('Cache-Control: public'); 
    header('Content-Description: File Transfer'); 
    header("Content-Disposition: attachment; filename={$pdf_file}"); 
    header('Content-Type: application/pdf'); 
    header('Content-Transfer-Encoding: binary'); 
    readfile($pdf_file); 
    exit; 
} 
die("ERROR: invalid song or you don't have permissions to download it."); 
?> 
+0

Das funktioniert gut. Aber dieses Skript lädt die Datei herunter. Ich muss nur die PDF-Datei im Browser selbst öffnen. Irgendeine Lösungsmöglichkeit? – Hari

+0

Ja, ich habe es :-). Danke @Rahul Patel – Hari

+0

Hallo Hari, Verwenden Sie bitte folgenden Code, um die Datei im Browser anzuzeigen.

0

Wenn Sie nicht möchten, dass Benutzer die Dateien eines anderen Benutzers sehen, dann erwarten Sie niemals ein Ergebnis vom Benutzer von der Client-Seite.

Speichern Sie die Daten in der Sitzung/Datenbank etwas und rufen Sie den Wert ab, wenn die Verwendung eingeschränkt ist.

0

Ist es wirklich notwendig, ID dem Dateinamen zuzuweisen? Die Verwendung von id als ein verstecktes Feld ist immer noch sehr anfällig.

Warum generieren Sie keinen Dateinamen mit einer eindeutigen ID für jeden Benutzer? Sie können bei Bedarf ein weiteres Datenbankfeld namens uuid (char 36) hinzufügen. Sie können uniqid() functino verwenden.

Also, jedes Mal, anstatt mit der Primärschlüssel-ID zu überprüfen, können Sie UUID in Sitzung speichern und entsprechend überprüfen.

+0

So wird der Link wie 'view my file' Recht? Dann kann der Benutzer wieder eine beliebige ID eingeben und die Datei eines anderen Benutzers anzeigen. – Hari

+0

Gemäß Ihrer Anforderung kann ein Benutzer nur seine Datei anzeigen?Wenn dies der Fall ist, müssen wir die UUID in der Datenbank speichern und diese UUID mit dem aktuell angemeldeten Benutzer überprüfen. Wenn es übereinstimmt, haben Sie die Erlaubnis. –

+0

Wo soll ich überprüfen, ob die angeforderte Datei dem aktuell angemeldeten Benutzer zugewiesen ist? Soll ich eine neue Datei erstellen und dort die UUID aus der URL extrahieren, die Datenbank überprüfen, wenn sie zugewiesen ist, dann erlaube ihm den Link 'uuid.pdf'? Können Sie mir bitte ein einfaches Beispiel geben? – Hari

0

bessere Lösung ist, prüfen isset $ _SESSION [ ‚userId‘] und dass

<?php 
    session_start(); 
    $link = $_SERVER['PHP_SELF']; 
    $link_array = explode('/',$link); 
    echo $page = end($link_array); 
    $id = explode('.',$page); 
    $userid = $id[0]; 
    if(isset($_SESSION['userId']) && $userid== $_SESSION['userId']){   
     // display file 
    } 
    else{ 
     //not authorized 
    } 
?> 
Verwandte Themen