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 Bausteinen (Snippets) aus den Bereichen CSS, PHP, JavaScript und MySQL.

CSS - Blinkende Inhalte mit Keyframes

PHP - CSV-Datei in eine DB-Tabelle einlesen

JavaScript - Erkennen ob die Feststelltaste bei der Passworteingabe eingeschaltet ist

MySQL - Datensätze (Gehalt) zwischen 2000 und 3000 anzeigen