PHP - Passwortschutz für den Download

Hiermit ist es möglich, Dateien mit einem individuellen Passwortschutz zu versehen. Es können beliebig viele Benutzer im Skript eingetragen werden, denen dann jeweils nur ein bestimmter Download zur Verfügung gestellt wird.


<?php

// Passwortschutz für den Download

// Namen, Passwörter und Download-Dateien eintragen
$personen = [
    
'Edwin Huber' => [
        
'passwort' => '123',
        
'download' => 'katalog.pdf'
    ],

    
'Werner Zenk' => [
        
'passwort' => '1234',
        
'download' => 'apfel.gif'
    ],

    
'Paul Meier' => [
        
'passwort' => '12345',
        
'download' => 'verzeichnis/archiv.zip'
    ],

    
'Thomas Müller' => [
        
'passwort' => '123456',
        
'download' => 'verzeichnis/datei.txt'
    ],
];

if (isset(
$_POST["name"])) {

 
// Name und Passwort überprüfen
 
if ($personen[$_POST["name"]]["passwort"] === $_POST["passwort"]) {

  
// Datei herunterladen
  
if (file_exists($personen[$_POST["name"]]["download"])) {
   
$mimetype mime_content_type($personen[$_POST["name"]]["download"]);
   
header("Content-Type: " $mimetype);
   
header("Content-Disposition: attachment; filename=" basename($personen[$_POST["name"]]["download"]));
   
header("Content-Length: " filesize($personen[$_POST["name"]]["download"]));
   
header("Content-Transfer-Encoding: binary");
   
header("Cache-Control: post-check=0, pre-check=0");
   
readfile($personen[$_POST["name"]]["download"]);
   exit;
  }
 }
}
?>

<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Download</title>
 </head>
<body>

<form method="post">
 <label>Name : <input type="text" name="name" required="required"></label> 
 <label>Passwort : <input type="password" name="passwort" required="required"></label> 
 <input type="submit" value="Download">
</form>

</body>
</html>

Beachten Sie, das der PHP-Code vor jeglicher Ausgabe an den Browser ausgeführt werden muss, das heißt ganz oben in der Datei!

Datums-abhängiger Download


<?php

// Passwortschutz für den Download und Datums-abhängiger Download

// Namen, Passwörter, Download-Dateien und Datum eintragen
$namen = [
    
'Edwin Huber' => [ // Name
        
'passwort' => '123'// Passwort
        
'download' => 'verzeichnis/datei1.php'// Pfad zur Datei
        
'datum' => '27.10.2019' // Datum bis zum ... (Format: TT.MM.JJJJ)
    
],

    
'Paul Meier' => [
        
'passwort' => '1234',
        
'download' => 'verzeichnis/datei2.zip',
        
'datum' => '04.07.2025'
    ],

    
'Thomas Müller' => [
        
'passwort' => '12345',
        
'download' => 'verzeichnis/datei3.pdf',
        
'datum' => '19.05.2018'
    ],
];

$ausgabe '';

if (
$_SERVER["REQUEST_METHOD"] == "POST") {

 
// Name und Passwort überprüfen
 
if (isset($namen[$_POST["name"]]["passwort"]) && $namen[$_POST["name"]]["passwort"] === $_POST["passwort"]) {
  
$ausgabe 'Die Anmeldung war erfolgreich.<br>';
  
  
// Datum überprüfen (Datum bis zum ...)
  
if (date("d.m.Y") <= $namen[$_POST["name"]]["datum"]) {

   
// Datei herunterladen
   
if (file_exists($namen[$_POST["name"]]["download"])) {

    
header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=" basename($namen[$_POST["name"]]["download"]));
    
header("Content-Length: " filesize($namen[$_POST["name"]]["download"]));
    
header("Content-Transfer-Encoding: binary");
    
header("Cache-Control: post-check=0, pre-check=0");
    
readfile($namen[$_POST["name"]]["download"]);
   }
   else {
    
$ausgabe .= 'Die Angeforderte Datei wurde nicht gefunden!<br>';
   }
  }
  else {
   
$ausgabe .= 'Die Datei konnte bis zum: ' $namen[$_POST["name"]]["datum"] . ' heruntergeladen werden.<br>';
  }
 }
 else {
  
$ausgabe .= 'Die Anmeldung war fehlerhaft!<br>';
 }
}
?>

<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Download</title>
 </head>
<body>

<form action="" method="post">
 <label>Name : <input type="text" name="name" required="required"></label> 
 <label>Passwort : <input type="password" name="passwort" required="required"></label> 
 <input type="submit" value="Download">
</form>

<p><?=$ausgabe;?></p>

</body>
</html>

Tipp

Das Verzeichnis in dem die Download-Dateien liegen, sollte mit einer .htaccess-Datei gesichert sein oder das Verzeichnis sollte außerhalb des "Document Roots" liegen.

Alternative

Mit der HMTL5-Spezifikation können Sie das Download-Attribut zu einem beliebigen Tag hinzufügen, um den Download zu erzwingen.

<a href="afile.txt" download="filename.txt">Download</a>

Download

Bausteine  Alle Anzeigen

Eine zufällige Auswahl von Codeschnipseln aus den Bereichen HTML, CSS, PHP, JavaScript und MySQL.

<dialog> Dialog Element

CSS - Lightbox

PHP - Prüfen ob die Datei in der Zeichenkodierung UTF-8 gespeichert wurde

JavaScript - Lichtregler

MySQL - Kleinsten Wert einer Tabellenspalte ermitteln

Zu viel Animation
Zu viel Animation, zum Beispiel mit animierten Gifs, wirkt unprofessionell und lenkt ab. Jede Seite sollte höchstens ein animiertes Element enthalten, besser man verzichtet ganz darauf. (Alles, was über den Bildschirm hopst und zappelt und blinkt — weg damit! ;- )