Musterlösung
Grünschnabel
LÖSUNG: Geschütze Download-Url OHNE Timeout
so erstellt man einen geschützten Download-Link, der ohne PHP Timeout und bei jeder Dateigröße sauber läuft.
Das Prinzip sieht so aus:
Download-Link mit Timestamp wird auf Gültigkeit geprüft --> RemoteIP und Timestamp werden in DB erfasst --> .htaaccess mit IPs aus DB wird erstellt --> Download ist freigegeben
WICHTIG:
1. Man muss eine neue SQL Tabelle (Bezeichnung "IPListe") mit zwei Spalten ("ip", "timestamp") erstellen.
2. Auf dem Server einen neuen Ordner (Bezeichnung "sicher") erstellen. (Dort dürfen die Downloaddateien rein die geschützt werden sollen). Die Dateien "link.php" und "download.php" liegen einen Ordner weiter oben.
download.php (regelt den Download):
link.php (erstellt Download-Links, Gültigkeit von 20 Tagen):
Ein Download-Link sieht dann so aus:
http://www.meinedomain.de/test/download.php?code=dl1-d1a-0987145331
Link ist 20 Tage gültig und kann per Mail etc. verschickt werden.
PS: Absolute Musterlösung!
so erstellt man einen geschützten Download-Link, der ohne PHP Timeout und bei jeder Dateigröße sauber läuft.
Das Prinzip sieht so aus:
Download-Link mit Timestamp wird auf Gültigkeit geprüft --> RemoteIP und Timestamp werden in DB erfasst --> .htaaccess mit IPs aus DB wird erstellt --> Download ist freigegeben
WICHTIG:
1. Man muss eine neue SQL Tabelle (Bezeichnung "IPListe") mit zwei Spalten ("ip", "timestamp") erstellen.
2. Auf dem Server einen neuen Ordner (Bezeichnung "sicher") erstellen. (Dort dürfen die Downloaddateien rein die geschützt werden sollen). Die Dateien "link.php" und "download.php" liegen einen Ordner weiter oben.
download.php (regelt den Download):
PHP:
<?PHP
//WICHTIG: neue sql datenbank manuell einrichten -- tabellenname: IPListe, spalte1: ip, spalte2: timestamp
$explode = explode('-', $_GET['code']);
$get_fileID = $explode[0];
$get_seal = $explode[1];
$get_timestamp = $explode[2];
$seal = substr(md5("blabla" . $get_fileID . $get_timestamp), 0, 3);
if($seal == $get_seal) {
if(time() < $get_timestamp) {
//sql zeugs
$dbserver = "db.sqlservernamexy.de"; // MYSQL Hostname <---- ANPASSEN************************************!
$DB = "sqldb123"; // MYSQL Datenbankname <---- ANPASSEN************************************!
$dbuser = "sqluser123"; // MYSQL Username <---- ANPASSEN************************************!
$dbpass = "sqlpw123"; // MYSQL Passwort <---- ANPASSEN************************************!
$conn = mysql_connect($dbserver,$dbuser,$dbpass);
$ip22 = $_SERVER['REMOTE_ADDR'];
$downloadzeit=10000; // Sekunden
$DOCUMENT_ROOT = "/mnt/webe/test/sicher"; // <---- ANPASSEN************************************!
$TMPhta1 = "AuthType Basic" ."\n". "order deny,allow" ."\n". "deny from all" ."\n" ;
$faker403 = "ErrorDocument 403 '<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>'";
//mit db verbinden
if (!$conn){
die("Fehler! Die Datenbank ist nicht erreichbar!");
}
mysql_select_db($DB,$conn);
// alle verfallenen Einträge löschen + doppelte ip löschen
$query = "DELETE FROM IPListe WHERE (ip) = '".$ip22."'";
$result = mysql_query($query) or die(mysql_error());
$query = "DELETE FROM IPListe WHERE (timestamp) < '".time()."'";
$result = mysql_query($query) or die(mysql_error());
//ip einhacken
$query = "INSERT INTO IPListe (ip, timestamp) VALUES('".$ip22."','" .(time()+$downloadzeit)."')";
$result = mysql_query($query) or die(mysql_error());
//db lesen
$result = mysql_query("SELECT * From IPListe");
while ($rows=mysql_fetch_array($result)) {
$TMPips = $TMPips . "allow from " . $rows[ip] . "\n";
}
//htaccess schreiben
$htaccess = fopen("$DOCUMENT_ROOT"."/.htaccess", "w");
fputs($htaccess, $TMPhta1 . $TMPips . $faker403);
fclose($htaccess);
//DOWNLOAD STARTEN
if("dl1" == $get_fileID) {header("Location: http://www.meinedomain.de/test/sicher/datei1.zip");} // <---- ANPASSEN************************************!
if("dl2" == $get_fileID) {header("Location: http://www.meinedomain.de/test/sicher/datei1.zip");} // <---- ANPASSEN************************************!
if("dl3" == $get_fileID) {header("Location: http://www.meinedomain.de/test/sicher/datei1.zip");} // <---- ANPASSEN************************************!
//ENDE
} else {
echo "Download ist nicht mehr gültig!";
}
} else {
echo "Fehler im Download-Link!";
}?>
link.php (erstellt Download-Links, Gültigkeit von 20 Tagen):
PHP:
<?PHP
$md5pw = "blabla";
$download_link1 = "http://www.meinedomain.de/test/download.php?code=" . "dl1" . "-" . md5($md5pw . 'dl1' . strtotime('+ 500 Hours')) . "-" . strtotime("+ 500 Hours"); // <---- ANPASSEN************************************!
$download_link2 = "http://www.meinedomain.de/test/download.php?code=" . "dl2" . "-" . md5($md5pw . 'dl2' . strtotime('+ 500 Hours')) . "-" . strtotime("+ 500 Hours"); // <---- ANPASSEN************************************!
$download_link3 = "http://www.meinedomain.de/test/download.php?code=" . "dl3" . "-" . md5($md5pw . 'dl3' . strtotime('+ 500 Hours')) . "-" . strtotime("+ 500 Hours"); // <---- ANPASSEN************************************!
echo "Download 1" . "<br>";
echo $download_link1 . "<br>" . "<br>";
echo "Download 2" . "<br>";
echo $download_link2 . "<br>" . "<br>";
echo "Download 3" . "<br>";
echo $download_link3 . "<br>" . "<br>";
?>
Ein Download-Link sieht dann so aus:
http://www.meinedomain.de/test/download.php?code=dl1-d1a-0987145331
Link ist 20 Tage gültig und kann per Mail etc. verschickt werden.
PS: Absolute Musterlösung!