Php - Безопасный способ предоставить доступ к файлу через скачивание для конечного пользователя? - PullRequest
0 голосов
/ 09 октября 2018

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

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

0 голосов
/ 19 октября 2018
  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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...