PHP - Passwortschutz für den Download

Hiermit ist es möglich, Dateien (hier ZIP-Archive) 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 - ZIP-Archive

// Namen, Passwörter und Download-Dateien eintragen
$namen = [
    
'Edwin Huber' => [
        
'passwort' => '123',
        
'download' => 'verzeichnis/datei1.zip'
    
],

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

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

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

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

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

   
header("Content-Type: application/zip"); // application/zip
   
header("Content-Disposition: " . (!strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 5.5") ? "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"]);
  }
 }
}
?>

<!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>

</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!

PDF-Dateien

Für PDF-Dateien, mit kleinen Änderungen


<?php

// Passwortschutz für den Download - PDF-Dateien

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

    
'Paul Meier' => [
        
'passwort' => '1234',
        
'download' => 'verzeichnis/datei2.pdf'
    
],

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

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

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

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

   
header("Content-Type: application/pdf"); // application/pdf
   
header("Content-Disposition: " . (!strpos($_SERVER["HTTP_USER_AGENT"], "MSIE 5.5") ? "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"]);
  }
 }
}
?>

<!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>

</body>
</html>

Eine Liste der Content-Type ( MIME-Type) finden Sie unter:
https://de.wikipedia.org/wiki/Liste_von_Dateinamenserweiterungen

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

Eine zufällige Auswahl von „Bausteinen” (Snippets) aus den Bereichen CSS, PHP, JavaScript und MySQL.

CSS - Blinkende Inhalte mit Keyframes

PHP - Welcher Tag ist in X-Tagen

JavaScript - Verzögerte Umleitung mit JavaScript

MySQL - Abrufen eines zweispaltigen Ergebnisses in ein Array