Maskování cesty k souborům

lukyn_94
Člen | 12
+
0
-

Dobrý den , chtěl bych poprosit a zeptat se jakou metodou se dá maskovat cesta k souborů mám namysli www.stranka.cz/…kysoubor.pngwww.stranka.cz/file/token z db a jestli to je efektivní aby to nebylo zbytečný jesti přes zdroják stránky nezjistí reálnou cestu ? Děkuji všem za každou radu .

Gappa
Nette Blogger | 199
+
0
-

V principu se to většinou dělá tak, že nějaká url (např. example.com/download/123) po splnění podmínek (přihlášený, správná práva atp.) načte obsah souboru do paměti a pak ho okamžitě odešle na výstup do prohlížeče, který obsah zobrazí/stáhne (podle hlaviček).

Tohle řešení ale přestává být vhodné, pokud má jít např. o streamování videa nebo obecně velké soubory, to lze řešit třeba pomocí mod_auth_token.

Určitě ale bude existovat ještě nějaké jiné řešení :)

David Matějka
Moderator | 6445
+
+2
-

pro snadne odeslani velkeho souboru skrz php je nejlepsi readfile, ktere je setrne k pameti

Felix
Nette Core | 1186
+
+5
-

Nedavno jsem objevil (do ted se za to stydim). Ze existuji specialni hlavicky pro odesilani souboru.

Napr. pro Apache je to X-Sendfile.

Snippet z nejake ukazky (ne moje) [https://tn123.org/mod_xsendfile/].

<?php
...
if ($user->isLoggedIn())
{
    header("X-Sendfile: $path_to_somefile");
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$somefile\"");
    exit;
}
?>
<h1>Permission denied</h1>
<p>Login first!</p>

Principialne jde o to, ze jenom webserveru reknes, jakej soubor ma za tebe odeslat. A on ho nacte. PHP tak nezdrzuje, ale je to v rezii webserveru.

Pro ruzne webservery jsou ty hlavicky ruzne, tak bacha na to.

Editoval Felix (30. 8. 2018 16:07)

lukyn_94
Člen | 12
+
0
-

Dobře kouknu na to chlapy děkuji všem za každou reakci a typ.

Petr Parolek
Člen | 455
+
0
-

Ahoj, já používám:

<?php
public function actionDownloadPdf($id)
{
	$document = $this->idocumentsRepository->getInvoice($this->user->id, $id);

	if (!$document) {
		$this->error("Dokument nebyl nalezen!");
	}

	$file_path = realpath(__DIR__ . "/../../www") . "/" . $document->getPdfUrl();
	$file_content = @file_get_contents($file_path);

	$httpResponse = $this->context->getByType('Nette\Http\Response');

	$httpResponse->setHeader('Content-type', 'application/pdf');

	$httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . basename($file_path) . '"');

	$httpResponse->setHeader('Content-Transfer-Encoding', 'binary');
	$httpResponse->setHeader('Content-Length', filesize($file_path));
	$httpResponse->setHeader('Accept-Ranges', 'bytes');

	$this->sendResponse(new Nette\Application\Responses\TextResponse($file_content));
}
?>