Это скорее вопрос безопасности, и я не уверен, является ли этот подход безопасным и достаточно безопасным способом загрузки файла и представления его веб-пользователю?
У нас есть файлы счетов клиентов, которые хранятся на сервере (в общедоступном месте), затем мы читаем их через код PHP в файле (в общедоступном месте с файлом), как показано ниже:
Конечно, мы аутентифицируем пользователя в сеансе перед тем, как получить к нему доступ, однако, если конечный пользователь знает, где находятся файлы, он может манипулировать своим запросом на чтение не авторизованных счетов ООН.
Мне просто интересно, если этот способ
1. Представление файлов конечному пользователю достаточно безопасно?
2. Конечный пользователь вообще не будет знать, где файлы хранятся на сервере?
3. Любая другая рекомендация о том, как справиться с подобной ситуацией?
$i = $invoice->get();
$filename = sprintf(INV_PDF_FILENAME,$i['customerid'],date('Ymd',$i['dateIssued']));
$x = sprintf('/tmp/invoices/%s',$filename);
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Expires: 0');
header('Pragma: cache');
header('Cache-Control: private');
readfile($x);
$filename
выполнять атаки через каталог).realpath($x)
начинается с каталога, в котором вы ожидаете их найти.Например:
$x = sprintf('/tmp/invoices/%s',$filename);
$realpath = realpath($x);
if (strpos($realpath, '/tmp/invoices/') !== 0) {
// Note: The strict comparison to 0 matters.
// It means that the real file path must begin with "/tmp/invoices/"// or else this redirect/exit gets called.
header("Location: /error");
exit;
}
Других решений пока нет …