Zabezpečení složky ze soubory
- marcelxy
- Člen | 70
Zdravím,
potřeboval bych zabezpečit složku ze soubory
(přílohy,obrázky,pdf,atd..)
využívané v různých časti webu aby nebyly volně přístupné bez
přihlášení případné přístupových práv,
tzn. aby nikdo kdo případně zná adresu se knim bez přihlášení
případně autorizace nedostal.
Zatím je mám všechny umístěné ve složce www/data ale kdokoliv kdo zná
adresu se knim i bez přihlášení dostane.
když je umístím někam do chráněné části webu tak se knim nedostanu ani
po přihlášení.
jak se tato problematika řeší?
díky za rady
Editoval marcelxy (30. 1. 2021 12:40)
- Petr Parolek
- Člen | 455
Ahoj, řešímto jednodušše v presenteru:
public function actionDownloadDocumentPdf(int $id): void
{
$item = $this->someRepository->findOneBy(['user' => $this->getUser()->id, 'id' => $id]);
if (!$item) {
$this->error('Položka nebyla nalezena!');
}
if ($item->getItemPdfUrl() !== null) {
$httpResponse = $this->context->getByType('Nette\Http\Response');
$httpResponse->setHeader('Content-type', 'application/pdf');
$file_path = __DIR__ . '/../../../www/../uploaded/' . $this->getUser()->id . '/'
. $item->getPdfUrl();
$file_content = file_get_contents($file_path);
$httpResponse->setHeader('Content-Disposition', 'inline; filename="' . basename($file_path) . '"');
$httpResponse->setHeader('Content-Transfer-Encoding', 'binary');
$httpResponse->setHeader('Content-Length', (string) filesize($file_path));
$httpResponse->setHeader('Accept-Ranges', 'bytes');
$this->sendResponse(new \Nette\Application\Responses\TextResponse($file_content));
} else {
$this->error('Položka nebyla nalezena!');
}
}
Editoval ppar (30. 1. 2021 12:52)
- lookass
- Člen | 54
Jestli používáš Apache a jestli jde o zabezpečení souborů, aby nebyly přístupné přes prohlížeč např. takto www.domena.cz/files/file.pdf, tak to řeším pomocí .htaccess
Order Allow,Deny
Deny from all
Nicméně na nginx.com dokládají, že to není zrovna efektivní, takže by mě taky zajímalo, jak to udělat správně. (Za předpokladu, že chci používat Apache)
Editoval lookass (30. 1. 2021 15:25)
- Marek Bartoš
- Nette Blogger | 1280
Soubory si uložíš do veřejně nedostupné složky a jejich odesílání
vyřešíš skrze presenter, který podle url adresy najde příslušný soubor
a odešle hlavičky. Hlavičky si pak přečte webserver a sám už se postará
o odeslání souboru.
Je možné si načíst soubor v php a odeslat například přes TextResponse,
ale zbytečně to zvyšuje nároky na výkon.
Řešení s jednotlivými webservery se ale různí:
- nginx: https://www.nginx.com/…s/xsendfile/
- lighthttpd: https://redmine.lighttpd.net/…PD-send-file
- apache: https://tn123.org/mod_xsendfile/