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.

<col> Tabellenspalten vordefinieren

CSS - Nur gefüllte Tabellenzellen hervorheben

PHP - Authentifizierung eines Benutzers mit PDO und password_verify()

JavaScript - Prüfen, ob die Funktion vor dem Aufruf vorhanden ist

MySQL - Text in einer Spalte hinzufügen

Schlagzeile entscheidet
Maßgeblich beeinflusst wird dieser erste Eindruck durch die auf Ihrer Website verwendeten Headlines (Schlagzeilen): Wenn Sie Teaser, also Anreißer-Texte, verwenden, dann entscheidet die verwendete Headline oft, ob man zum Artikel weiterklickt. Die über einer Seite platzierte Haupt-Headline ist ein wichtiges Kriterium für die Entscheidung, ob weitergelesen wird oder nicht. Auch die im Text verwendeten Subheadlines spielen dabei eine große Rolle.