Jak docílit toho aby byl soubor možný stáhnout jen po přihlášení do systému a to i když bude cesta k soboru známa to nebylo možné stáhnout a pouze jen přihlášeným uživatelům...?
Diskuse
Téma: Stažení souboru
Dávat adresy ve stylu download?id=x a ve scriptu:
if(_loginidicator){
// sem dát header ke stažení souboru
}else {
return "nemáš oprávnění";
}
if(_loginidicator){
// sem dát header ke stažení souboru
}else {
return "nemáš oprávnění";
}
Moc tomu nerozumím trochu polopaticky děkuji.
Vic polopaticky to ani snad nejde. Mas proste adresu /download?file=soubor.zip a mas slozku se soubory ke stazeni a v te podmince je rozhodnuti o tom zda je uzivatel prihlasen ci nikoliv. A pokud je tak overis zda ten soubor existuje v te slozce a das tam hlavicky (header) pro vynucene stahovani. pokud by nekdo stahoval soubor bez prihlaseni tak ho nestahne. tot vse a to by jsi vycetl z tech odkazu co jsem poslal
Vytvoříš so v rootu webu soubor download.php s bosahem:<?php
/*---- inicializace jadra ----*/
define('_indexroot', './');
require(_indexroot."core.php");
if(_loginidicator){
$name = $_GET['file'];
$file = 'uploads/' . $name;
if (file_exists($file)) {
header("Content-Description: File Transfer");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$name\"");
readfile($file);
}
else{
_systemMessage("Chyba", 'Soubor neexistuje');
}
}
else{
_systemMessage("Chyba", $_lang['notpublic.title']);
}
?>a odkazy budeš dávat tak jak psal jirka /download?file=soubor.zip
Já osobně tedy ještě používám base64_encode a decode, ale tím tě nebudu zatěžovat.
/*---- inicializace jadra ----*/
define('_indexroot', './');
require(_indexroot."core.php");
if(_loginidicator){
$name = $_GET['file'];
$file = 'uploads/' . $name;
if (file_exists($file)) {
header("Content-Description: File Transfer");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$name\"");
readfile($file);
}
else{
_systemMessage("Chyba", 'Soubor neexistuje');
}
}
else{
_systemMessage("Chyba", $_lang['notpublic.title']);
}
?>a odkazy budeš dávat tak jak psal jirka /download?file=soubor.zip
Já osobně tedy ještě používám base64_encode a decode, ale tím tě nebudu zatěžovat.
je to nastrel, necekej ze to jen zkopcis a vlozis
- core.php neni v rootu
- vypis zprav je pres _formMessage tusim
- core.php neni v rootu
- vypis zprav je pres _formMessage tusim
Ano jirka má prvdu, takhle to bylo pro starší verzi. v nové je třeba použít inicializaci takto:require './require/load.php';
require './require/functions-template.php';
SL::init('./');Zprávu může použít buď _formMessage() jak píšeš a nebo přes _systemMessage() s tím že systém message se volá ještě před jakýmkoliv výstupem. a nedá se přehlédnout. Je fakt, že kvůli neexistujícímu souboru není potřeba zastavit celou aplikaci, takže možná opravdu použít _formMessage()
require './require/functions-template.php';
SL::init('./');Zprávu může použít buď _formMessage() jak píšeš a nebo přes _systemMessage() s tím že systém message se volá ještě před jakýmkoliv výstupem. a nedá se přehlédnout. Je fakt, že kvůli neexistujícímu souboru není potřeba zastavit celou aplikaci, takže možná opravdu použít _formMessage()
Jen takový postřeh - přes ten skript si může kdokoliv stáhnout cokoliv z daného webového prostoru, včetné PHP skriptů, protože
$file není absolutně nijak ošetřené./download.php?file=../config.php a dík za přístupové údaje 🙂Proto jsem psal to ID, kdy jsou záznamy uložené v db.
Také si před stažením můžeš logovat počty stažení. Napiš mi, něco takového jsem už psal, poslal bych ti to.
Také si před stažením můžeš logovat počty stažení. Napiš mi, něco takového jsem už psal, poslal bych ti to.
Ano Shiro, vím o tom. Tohle byl jen nástřel jak by to mohlo fungovat a i proto jsem psal, že je možné to alesoň trochu komplikovat přes base64.
Cpát soubory do DB mi přijde zbytečné, protože jestli mám v tom skriptu psát kontrolu na adresář a nebo na to jestli ID je v DB vyjde nastejno.
A ať teda nežeru, tak tento řádek:$name = $_GET['file'];stačí upravit:$name = pathinfo($_GET['file'],PATHINFO_BASENAME);
Cpát soubory do DB mi přijde zbytečné, protože jestli mám v tom skriptu psát kontrolu na adresář a nebo na to jestli ID je v DB vyjde nastejno.
A ať teda nežeru, tak tento řádek:$name = $_GET['file'];stačí upravit:$name = pathinfo($_GET['file'],PATHINFO_BASENAME);