Download seznam – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Download seznam – PHP – Fórum – Programujte.comDownload seznam – PHP – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Pavelv0
Stálý člen
5. 9. 2014   #1
-
0
-

Zdravím, potřebuji na stránky umístit pár souborů ke stažení. Chtěl bych to udělat dynamicky, script projede adresář, vypíše jména souborů a přidá ikonu podle typu. Je něco na co si dát velký pozor? Nebo je lepší to řešit staticky?

Nahlásit jako SPAM
IP: 212.79.110.–
Reklama
Reklama
Matěj Andrle+1
Grafoman
5. 9. 2014   #2
-
0
-

#1 Pavelv
Zde opět vede mapa - přiřaď typům obrázky -> v asociativním poli.

data.php

$fileTypeMap = array("png" => "icon7.jpg");


ddd.php

$files = scandir("forDownload");

foreach($files as $file)
{
	$img = $fileTypeMap[pathinfo($file, PATHINFO_EXTENSION)];
	$fileName = pathinfo($file, PATHINFO_BASENAME);
	echo <<<END
<a href="download.php?file=$fileName">$fileName</a>
<img alt="..." src="$img" ... />
END;
}


CCA. takto bych to dělal já. A když-tak bych tam nastrkal AJAX...

Nahlásit jako SPAM
IP: 78.136.138.–
Pavelv0
Stálý člen
5. 9. 2014   #3
-
0
-

#2 Matěj Andrle
Ok, tak nějak jsem si to také představoval. Horší je sehnat ikony v rozumném formátu. Našel jsem ale třeba hezkou sadu ikon zde ovšem je potřeba to nejprve v nějaké programu rozřezat, nebo lze nějak pracovat rovnou s tím v php. Ne tedy v AJAXU

Nahlásit jako SPAM
IP: 212.79.110.–
Matěj Andrle+1
Grafoman
5. 9. 2014   #4
-
0
-

#3 Pavelv
Vemte téma z UNIXu/Linuxu (tam je téměř jen OpenSource SW) - třeba Tango:

http://tango.freedesktop.org/releases/tango-icon-theme-0.8.90.tar.gz

(Říká se tomu mimetype, pročež vše najdete ve složce velikost -> mimetypes. Příklad: "32x32\mimetypes")

BTW:
Rozbalí to třeba 7z - prvně GZIP, pak TAR.

Nahlásit jako SPAM
IP: 78.136.138.–
Pavelv0
Stálý člen
5. 9. 2014   #5
-
0
-

#4 Matěj Andrle
Díky, ale nakonec jsem sehnal hezčí sadu ikon. Ještě se zeptám, mám seznam, hypertextovýma odkazama jdou soubory zobrazit, ale jak docílit toho, aby se soubory nezobrazovali na webu, ale rovnou vyskočilo okno ke stažení?

Nahlásit jako SPAM
IP: 212.79.110.–
Matěj Andrle+1
Grafoman
5. 9. 2014   #6
-
0
-

#5 Pavelv
AJAX na to PHP, které zajistí stažení. (download.php) Ideál je, když navíc balí adresáře do archivů atp. Tedy ono PHP na zajištění stahování vydá na základě QueryStringu stream souboru... (Otevřeš stream a pošleš ho do pohledu.) A co se týče vzhledu - být tebou netvrdím, že je něco hezčí. Každému libo je dle vůle a charakteru. Mě se Tango líbí a jak jsem psal - můžeš si projít i dalši "icon theme" ze zmíněného prostředí.

BTW - QueryString jsem ti ukázal zde:

<a href="download.php?file=$fileName">$fileName</a>
Nahlásit jako SPAM
IP: 78.136.138.–
Pavelv0
Stálý člen
6. 9. 2014   #7
-
0
-

#6 Matěj Andrle
Zjistil jsem že to jde i bez AJAXu: 


$filename = $_GET['file'];

$mimeTypes = array(
    	'pdf' => 'application/pdf',
    	'txt' => 'text/plain',
    	'html' => 'text/html',
    	'exe' => 'application/octet-stream',
    	'zip' => 'application/zip',
    	'doc' => 'application/msword',
    	'xls' => 'application/vnd.ms-excel',
    	'ppt' => 'application/vnd.ms-powerpoint',
    	'gif' => 'image/gif',
    	'png' => 'image/png',
    	'jpeg' => 'image/jpg',
    	'jpg' => 'image/jpg',
    	'php' => 'text/plain'
);
 
$fileExt = pathinfo($filename, PATHINFO_EXTENSION);        
if(array_key_exists($fileExt, $mimeTypes)) {
  $mimeType = $mimeTypes[$fileExt];
}
else {
  $mimeType = 'application/force-download';
} 
           
header('Content-Description: File Transfer');     
header('Content-Type: '.$mimeType); 
header('Content-Disposition: attachment; filename="'. basename($filename) . '";'); 
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Cache-Control: private', false); // required for certain browsers 
header('Content-Length: '.filesize($filename));

ob_clean();
flush();

readfile($filename);
exit;


Jak bych měl ošetřit vstupní část, aby nebylo možné zavítat do jiné složky? Stačí najít lomítka a ty odstranit?

Nahlásit jako SPAM
IP: 212.79.110.–
Matěj Andrle+1
Grafoman
6. 9. 2014   #8
-
0
-

#7 Pavelv
Snad máš napevno určené, co je ke stažení - ne?

BTW:
Vskutku je dobré udělat datový soubor na konstanty...

Nahlásit jako SPAM
IP: 78.136.166.–
Kit+11
Guru
6. 9. 2014   #9
-
0
-

#8 Matěj Andrle
Na těch pár MIME je skoro zbytečné takový datový soubor dělat. Stačí, když to uzavře do funkce nebo objektu. Netvrdím, že je to ideální řešení, ale mně se líbí:

<?php
function getMime($fileExt) {
    switch ($fileExt) {
        case 'pdf': return 'application/pdf';
        case 'txt': return 'text/plain';
        case 'html': return 'text/html';
        case 'exe': return 'application/octet-stream';
        case 'zip': return 'application/zip';
        case 'doc': return 'application/msword';
        case 'xls': return 'application/vnd.ms-excel';
        case 'ppt': return 'application/vnd.ms-powerpoint';
        case 'gif': return 'image/gif';
        case 'png': return 'image/png';
        case 'jpeg': return 'image/jpeg';
        case 'jpg': return 'image/jpeg';
        case 'php': return 'text/plain';
    }
    return 'application/force-download';
}

$fileExt = pathinfo($filename, PATHINFO_EXTENSION);
$mimeType = getMime($fileExt);
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:a515:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV+42
God of flame
6. 9. 2014   #10
-
+1
-
Zajímavé
Kit +

nebylo by jednodussi zapnout u konkretniho adresare DirectoryIndex a nesrat se s tim v php, kdyz tam nepotrebuje zadny vychytavky jako omezeni pristupu (coz by taky zvladl http server)?

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pavelv0
Stálý člen
6. 9. 2014   #11
-
0
-

#8 Matěj Andrle
Snad máš napevno určené, co je ke stažení - ne?

Ano, to sice mám, ale nic nebrání uživatelovi napsat ?file=/../database/pass.txt

Nahlásit jako SPAM
IP: 212.79.110.–
Pavelv0
Stálý člen
6. 9. 2014   #12
-
0
-

#10 KIIV
Ano jednodušší bylo, ale takto se mi to zdá úhlednější

Nahlásit jako SPAM
IP: 212.79.110.–
Matěj Andrle+1
Grafoman
6. 9. 2014   #13
-
0
-

#11 Pavelv
To si piš, že zabrání! Normálně se k souborům dostat nedá a když-tak jen zakaž přístup ke složkám v konfiguráku a hotovo. Pak to jde jen zevnitř... Avšak proč by ti vlastně toto manuální stažení mělo vadit?

Nahlásit jako SPAM
IP: 78.136.166.–
Pavelv0
Stálý člen
6. 9. 2014   #14
-
0
-

#13 Matěj Andrle
To je zvláštní. Zadám ?file=../index.php a stáhnu si celý script....

Nahlásit jako SPAM
IP: 212.79.110.–
Matěj Andrle+1
Grafoman
6. 9. 2014   #15
-
0
-

#14 Pavelv
Jít by to nemělo už jen z logiky - to by pak byly všechny servery zcela bezbranné... Máš tedy blbě nastavený server - jak jsem psal, prostě to nastav tak, aby se nedaly soubory stahovat - vůbec. Pak to půjde jen zevnitř PHP scriptu, který si soubory otevře a jejich proud pošle do pohledu...

Nahlásit jako SPAM
IP: 78.136.166.–
Pavelv0
Stálý člen
6. 9. 2014   #16
-
0
-

#15 Matěj Andrle
Tomu nerozumím. Script na serveru přece má oprávnění pro otevírání dalších souborů souborů(include, require,..) To, že se daný script pak již nekompiluje ale zobrazuje rovnou uživateli má už na starosti právě obslužný script. Kde bych měl takové procházení zakázat? Uživatel zvenku se tam nedostane, díky direktivě Options -Indexes v .htaccess

Nahlásit jako SPAM
IP: 212.79.110.–
Kit+11
Guru
6. 9. 2014   #17
-
0
-

#14 Pavelv
Vytvořil sis klasickou bezpečnostní díru. Musíš si nejprve obsloužit, zda má uživatel právo ten soubor stáhnout. Nejlépe pokud odstraníš všechny cesty, které jsou před názvem souboru. Dáš pak před něj název adresáře, kam ten uživatel smí. Jinam se už nedostane.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:5560:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
6. 9. 2014   #18
-
0
-

#17 Kit
Jasně, takže to musim ošetřit přímo ve scriptu. Takže něco jako  

if(preg_match('~[+/*\\/\$\^]~', $_GET['file']))
  return;
Nahlásit jako SPAM
IP: 212.79.110.–
Matěj Andrle+1
Grafoman
6. 9. 2014   #19
-
0
-

Já tuto situaci nechápu. Pokud jde o pár souborů, pak přeci stačí list povolených souborů a zbytek jak jsem psal...

Nahlásit jako SPAM
IP: 78.136.166.–
Kit+11
Guru
6. 9. 2014   #20
-
0
-

#18 Pavelv
Určitě dej nahrávané soubory do samostatného adresáře, např. "downloads". Skript pak bude vypadat asi takto: 

<?php
$filename = 'downloads/' . basename($_GET['file']);
$fileExt = pathinfo($filename, PATHINFO_EXTENSION);
$mimeType = getMime($fileExt);
header('Content-Type: ' . $mimeType);
header('Content-Length: ' . filesize($filename));
readfile($filename);
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:5560:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
6. 9. 2014   #21
-
0
-

#20 Kit
Ano na funkci basename jsem zapoměl. Ale výsledek je stejný, s tím že já to testoval i na další znaky které by se tam neměli vyskytnout

Nahlásit jako SPAM
IP: 212.79.110.–
Kit+11
Guru
6. 9. 2014   #22
-
0
-

#21 Pavelv
Nechtělo se mi zkoumat, co ten tvůj regulár dělá, proto jsem použil standardní funkci basename().

Mít data pro uživatele odděleně je docela důležité. Také je důležité, aby skripty uložené do tohoto adresáře nebylo možné spustit.

Zajímavou variantou by mohlo být uložení do databáze, ale to se hodí spíš pro malé soubory.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:5560:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 36 hostů

Podobná vlákna

Download — založil palynko

Download — založil Jakub Vojáček

Download — založil to_jsem_ja

C++ DOWNLOAD — založil Nery

Download v c++ — založil Feri83

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý