Autor | Zpráva | ||
---|---|---|---|
Zetrozet Profil * |
Jak lze upravit Header v PHP-skriptu, aby .htaccess rozlišil pokus o přímé stažení souboru od stažení PHP-skriptem
Řešil jsem, způsob rozlišení přímého stahování souboru od stahování prostřednictvím php-skriptu. Pak jsem zjistil, že funkce download() - viz níže - posílá na server hlavičku shodnou s přímým downloadem souboru. Teď už mám jen otázku - co a jak lze funkcí download() přidat do hlavičky pro stahování, aby se stáhlo to, co má a přitom .htaccess odlišil stahování download() od přímého downloadu. <? if (isset($_GET["href"])){ Header("Content-Description: File Transfer"); Header("Content-Type: application/force-download"); $pos=strrpos($_GET["href"],"/")+1; $fle=substr($_GET["href"],$pos,strlen($_GET["href"])-$pos); if (isset($_GET["name"])) $fle=$_GET["name"]; Header("Content-Disposition: attachment; filename=".$fle); include($_GET["href"]) ; die(); } //pøesmìrování k souboru ke stažení, pokud existuje function download(){ //zkouška, zda se jedná o php soubor if (strpos(strtolower($_GET['file']),".php")){ header("Content-Description: File Transfer"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"".$_GET['name']."\""); include($_GET['fold']."/".$_GET['file']); hlasen(); die(); } if (strpos(strtolower($_GET['file']),".exe")){ header ("Location: ".$_GET['fold']."/".$_GET['file']); } if (strpos(strtolower($_GET['file']),".zip")){ header ("Location: ".$_GET['fold']."/".$_GET['file']); } //stažení souboru, vnutí prohlížeèi stažení html, pdf,... souboru, místo jeho zobrazení if (!isset($_GET['name'])) $_GET['name']=$_GET['file']; header("Content-Description: File Transfer"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"".$_GET['name']."\""); $f=fopen($_GET['fold']."/".$_GET['file'],"r"); echo fread($f,filesize($_GET['fold']."/".$_GET['file'])); fclose($f); hlasen(); die(); } Moderátor Davex: Vkládej prosím kódy mezi značky [>pre] a [>/pre] (stačí kliknout na ).
|
||
Davex Profil |
#2 · Zasláno: 15. 7. 2010, 21:23:45
Zetrozet:
„Pak jsem zjistil, že funkce download() - viz níže - posílá na server hlavičku shodnou s přímým downloadem souboru.“ Tu hlavičku pošle prohlížeči a ne serveru a za ní odešle výstup z includovaného souboru. V tomto skriptu mimochodem k volání funkce download() nikdy nedojde. „co a jak lze funkcí download() přidat do hlavičky pro stahování, aby se stáhlo to, co má a přitom .htaccess odlišil stahování download() od přímého downloadu“ Ono se stahuje něco jiného? Co je myšleno tím odlišením stahování a jaká je tam spojitost se souborem .htaccess? |
||
Zetrozet Profil * |
1) Ano, v této části skriptu není volání fce download. Dolů tedy připojím skript celý.
2) když uživatel nebo program v uživatelově počítači zadá například "http://www.zetrozet.biz/U2010/cisfu39.exe" dojde ke stahování mimo jakoukoli kontrolu. Já tohle stahování povolit musím, ale pokud tento příkaz přesměruji do PHP-skriptu, vytvoří po "kontrole" stejné volání a celé se to zacyklí. Teď ten kompletní download.php: <? if (isset($_GET["href"])){ Header("Content-Description: File Transfer"); Header("Content-Type: application/force-download"); $pos=strrpos($_GET["href"],"/")+1; $fle=substr($_GET["href"],$pos,strlen($_GET["href"])-$pos); if (isset($_GET["name"])) $fle=$_GET["name"]; Header("Content-Disposition: attachment; filename=".$fle); include($_GET["href"]) ; die(); } //přesměrování k souboru ke stažení, pokud existuje function download(){ //zkouška, zda se jedná o php soubor if (strpos(strtolower($_GET['file']),".php")){ header("Content-Description: File Transfer"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"".$_GET['name']."\""); include($_GET['fold']."/".$_GET['file']); hlasen(); die(); } if (strpos(strtolower($_GET['file']),".exe")){ header ("Location: ".$_GET['fold']."/".$_GET['file']); } if (strpos(strtolower($_GET['file']),".zip")){ header ("Location: ".$_GET['fold']."/".$_GET['file']); } //stažení souboru, vnutí prohlížeči stažení html, pdf,... souboru, místo jeho zobrazení if (!isset($_GET['name'])) $_GET['name']=$_GET['file']; header("Content-Description: File Transfer"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=\"".$_GET['name']."\""); $f=fopen($_GET['fold']."/".$_GET['file'],"r"); echo fread($f,filesize($_GET['fold']."/".$_GET['file'])); fclose($f); hlasen(); die(); } //adresa pro odeslání hlášení o chybě $adresa="chybawww@trunecek.cz"; $fold=$_GET["fold"]; if(isset($_SERVER["HTTP_REFERER"])) $back="<a href=\"".htmlspecialchars($_SERVER["HTTP_REFERER"])."\">Návrat zpět</a> " ; else $back=""; $foo="<br><br>$back<a href=\"index.php\">Úvodní stránka</a>\n</body></html>"; $kontakt="<br><br>Kontakujte prosím administrátora na <a href=\"mailto:$adresa?subject=".rawurlencode("Hlášení o chybě")."\">$adresa</a>, aby byla chyba rychle napravena."; $top="<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html; charset=windows-1250\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"engine/simple.css\">\n</head><body>"; $chyba1="<h3>Upozornění</h3>Chystáte se stáhnout soubor <strong>".$_GET['file']."</strong>.<br> Omlouváme se za vzniklé potíže, ale víše uvedený soubor doporučujeme nestahovat.<br> <strong>Požadovaný soubor je zřejmě poškozen, nebo byl napaden virem.</strong><br> Pokud jej přesto chcete stáhnout, můžete tak učinit <a href=\"".$_GET["fold"]."/".$_GET["file"]."\">zde</a> na vlastní nebezpečí.<br> Můžete také zkusit stáhnout soubor z alternativního serveru, adresy jsou uvedeny na úvodní stránce $kontakt"; $chyba2="<h3>Soubor je nedostupný</h3>\nPožadovaný soubor <strong>".$_GET['file']."</strong> neexistuje, nebo nemáte oprávnění jej stáhnout.<br>Můžete zkusit stáhnout soubor z alternativního serveru, adresy jsou uvedeny na úvodní stránce<br>Omlouváme se za vzniklé potíže."; //zkouška, zda existuje stahovaný soubor if (file_exists($_GET['fold']."/".$_GET['file'])){ $fil=explode(".",$_GET['file']); //zkouška, zda existuje příslušný md5 soubor if (file_exists($_GET['fold']."/".$fil[0].".md5")) $data=file($_GET['fold']."/".$fil[0].".md5"); else echo download(); $data=explode(" *",$data[0]); //kontrola md5 hashů if (md5_file($_GET['fold']."/".$_GET['file'])==$data[0]) echo download(); else echo $top.$chyba1.$foo; } else echo $top.$chyba2.$kontakt.$foo; ?> Moderátor Davex: Vkládej prosím kódy mezi značky [>pre] a [>/pre] (stačí kliknout na ).
|
||
Davex Profil |
#4 · Zasláno: 16. 7. 2010, 23:22:37
Zetrozet:
Takže jestli to dobře chápu, tak se ten uživatelův požadavek přepíše pomocí pravidla mod_rewrite na stahovací skript, který soubor includuje ze serveru pomocí http://, aby ho odeslal uživateli? Soubor by se neměl includovat z http:// a asi by se měl odeslat pomocí funkce readfile() přímo z disku. Také je dobré, nedůvěřovat obsahu GET proměnných, které mohou obsahovat cokoliv - je to veliká bezpečnostní díra.
|
||
Zetrozet Profil * |
#5 · Zasláno: 17. 7. 2010, 00:12:36
Je to tak. S použitím readfile() moc spěchat nebudu, už jednou jsem řešil ze dne na den problém, když se poskytovatel rozhodl zakázat některé funkce, které považoval za nebezpečné.
Potřebuju získat přehled o dowloadech souborů, abych věděl, jak moc uživatelé aktualizují. Taky nechápu pravidelné přístupy z IP na jiných kontinentech, když jim je české účetnictví i daňová evidence na prd, a navíc ani nemohou rozumět programovacímu jazyku, který je ryze český a jehož autoři tvrdí, že už 15 roků měl být převálcován dějinami. |
||
Keeehi Profil |
#6 · Zasláno: 17. 7. 2010, 00:20:04
Zetrozet:
„Taky nechápu pravidelné přístupy z IP na jiných kontinentech.“ A co třeba vyhledávače? |
||
Zetrozet Profil * |
#7 · Zasláno: 17. 7. 2010, 01:15:43
To je mi jasné, že jsou to podle všeho vyhledávače - těm je ale jedno, jak konkrétní informace jm předhodím, stejně je pro okolní svět nechápatelné povídání o dvou zcela konkrétních českých účetních programech. Naopak pro ty zahraniční vyhledávače má větší vypovídací schopnost obecná stránečka o českém účetnicví a daňové evidenci. Mám tam Kanadskou IP, která cca 3x denně vleze na hlavní stránku a odkráčí pryč - a tím se má jako o tom webu něco dozvědět.
|
||
Časová prodleva: 14 let
|
0