безопасность — Безопасный способ предоставить доступ к файлу через скачивание для конечного пользователя?

Это скорее вопрос безопасности, и я не уверен, является ли этот подход безопасным и достаточно безопасным способом загрузки файла и представления его веб-пользователю?

У нас есть файлы счетов клиентов, которые хранятся на сервере (в общедоступном месте), затем мы читаем их через код 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);

1

Решение

  1. Да, при условии, что нет других уязвимостей (то есть пользователь может изменять параметры, которые входят в $filename выполнять атаки через каталог).
  2. За исключением каких-либо дополнительных уязвимостей, предоставленный код не будет передавать локальный путь файла конечному пользователю.
  3. Убедитесь, что загруженные файлы хранятся вне корня документа. Подтвердите это 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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]