online-markus
Mitglied
Hi nochmal!
Ich habe mein Problem gestern schon einmal gepostet aber das hat nichts geholfen. Hab mich wohl nicht so geanu ausgedrückt. Deshalb versuche ichs jetzt nochmal.
Also mein Problem: Ich habe auf meiner Seite einen Bereich, bei dem man such über PHP-Sessions einloggen muss. In diesem Bereich möchte ich Downloads anbieten. Jetzt hab ich gehört, das man das am Besten so macht, indem man die Dateien in ein Verzeichnis lädt, die über einen absoluten Links (in der Browserzeile) nicht erreichbar sind. Das habe ich auch soweit hinbekommen:
Ihr könnt das Ganze mal ausprobieren: http://www.online-markus.de/privat/download_ohne_login.php?download=file1
Jetzt ist natürlich das Problem, das jeder einfach diesen Link aufrufen kann und sich die Datei(en) ziehen kann. Also stelle ich am Anfang (wie ich es auf jeder internen Seite mach?, die Datei checkuser.php, die prüft, ob man eingeloggt ist. Der Code der Datei sieht so aus:
Meine neue Seite für den download sieht dann schließlich so aus:
So, auch diese Datei könnt ihr wieder testen. Hier der Link: http://www.online-markus.de/privat/download.php?download=file1 Ihr müsst euch allerdings erst einloggen (User: admin / PW: 123456). Wenn ihr eingeloggt seit, einfach nochmal die URl in die Adress-Zeile kopieren und testen. Wie man sieht, funktioniert das nicht so ganz. Im Downloadfenster steht nicht dasselbr wie vorher.
mfg Seldge
Ich habe mein Problem gestern schon einmal gepostet aber das hat nichts geholfen. Hab mich wohl nicht so geanu ausgedrückt. Deshalb versuche ichs jetzt nochmal.
Also mein Problem: Ich habe auf meiner Seite einen Bereich, bei dem man such über PHP-Sessions einloggen muss. In diesem Bereich möchte ich Downloads anbieten. Jetzt hab ich gehört, das man das am Besten so macht, indem man die Dateien in ein Verzeichnis lädt, die über einen absoluten Links (in der Browserzeile) nicht erreichbar sind. Das habe ich auch soweit hinbekommen:
PHP:
// $download sei der Bezeichner für die zu ladende Datei
$download = $_GET['download'];
// Dieses Verzeichnis liegt außerhalb des Document Root und
// ist nicht per URL erreichbar.
$basedir = "/home/www/web238/files";
// Übersetzung von Download-Bezeichner in Dateinamen.
$filelist = array(
"file1" => "test.zip",
"file2" => "logo.bmp"
);
// Einbruchsversuch abfangen.
if (!isset($filelist[$download]))
die("Datei $download nicht vorhanden.");
// Vertrauenswürdigen Dateinamen basteln.
$filename = sprintf("%s/%s", $basedir, $filelist[$download]);
// Passenden Datentyp erzeugen.
header("Content-Type: application/octet-stream");
// Passenden Dateinamen im Download-Requester vorgeben,
// z. B. den Original-Dateinamen
$save_as_name = basename($filelist[$download]);
header("Content-Disposition: attachment; filename=\"$save_as_name\"");
// Datei ausgeben.
readfile($filename);
Jetzt ist natürlich das Problem, das jeder einfach diesen Link aufrufen kann und sich die Datei(en) ziehen kann. Also stelle ich am Anfang (wie ich es auf jeder internen Seite mach?, die Datei checkuser.php, die prüft, ob man eingeloggt ist. Der Code der Datei sieht so aus:
PHP:
//checkuser.php
session_start ();
if (!isset ($_SESSION["user_id"]))
{
header ("Location: index.php?fehler=1");
}
Meine neue Seite für den download sieht dann schließlich so aus:
PHP:
// Verweis auf checkuser.php, die prüft, ob man eingeloggt ist
include ("checkuser.php");
// $download sei der Bezeichner für die zu ladende Datei
// etwa:
$download = $_GET['download'];
// Dieses Verzeichnis liegt außerhalb des Document Root und
// ist nicht per URL erreichbar.
$basedir = "/home/www/web238/files";
// Übersetzung von Download-Bezeichner in Dateinamen.
$filelist = array(
"file1" => "test.zip",
"file2" => "logo.bmp"
);
// Einbruchsversuch abfangen.
if (!isset($filelist[$download]))
die("Datei $download nicht vorhanden.");
// Vertrauenswürdigen Dateinamen basteln.
$filename = sprintf("%s/%s", $basedir, $filelist[$download]);
// Passenden Datentyp erzeugen.
header("Content-Type: application/octet-stream");
// Passenden Dateinamen im Download-Requester vorgeben,
// z. B. den Original-Dateinamen
$save_as_name = basename($filelist[$download]);
header("Content-Disposition: attachment; filename=\"$save_as_name\"");
// Datei ausgeben.
readfile($filename);
So, auch diese Datei könnt ihr wieder testen. Hier der Link: http://www.online-markus.de/privat/download.php?download=file1 Ihr müsst euch allerdings erst einloggen (User: admin / PW: 123456). Wenn ihr eingeloggt seit, einfach nochmal die URl in die Adress-Zeile kopieren und testen. Wie man sieht, funktioniert das nicht so ganz. Im Downloadfenster steht nicht dasselbr wie vorher.
mfg Seldge