PHP Класс для скачивания файлов (download)

10.11.2015

Внимание, это пример того, как делать не нужно!

Данный пример кода читает файлы и "выплёвывает" их на скачивание браузеру. Все работает, но есть проблема - безопасность. Путь до файла передается просто в формате base64, но этот никак не помешает потенциальному взломщику поправить входной параметр так, чтобы получить любой файл с Вашего сервера (включая конфигурационный и системные)!

download.php (Download)

 <?

  class soDownload
  {

    public function fDownload()
    {
      //$sFile = c_Request::GetParam('fn', '');
      $sFile = isset($_REQUEST['fn'])?isset($_REQUEST['fn']):'';
      
      if($sFile)
	  {
	    //$sFile = $mosConfig_absolute_path.base64_decode($sFile);
	    $sFile = $_SERVER['DOCUMENT_ROOT'].base64_decode($sFile);
        if (file_exists($sFile))
        {
          // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
          // если этого не сделать файл будет читаться в память полностью!
          if (ob_get_level())
          {
            ob_end_clean();
          }

          // заставляем браузер показать окно сохранения файла
          header('Content-Description: File Transfer');
          header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename=' . basename($sFile));
          header('Content-Transfer-Encoding: binary');
          header('Expires: 0');
          header('Cache-Control: must-revalidate');
          header('Pragma: public');
          header('Content-Length: ' . filesize($sFile));
          // читаем файл и отправляем его пользователю
          if ($fd = fopen($sFile, 'rb'))
          {
            while (!feof($fd))
            {
              print fread($fd, 1024);
            }
            fclose($fd);
          }

          exit;
        }
	  }

    }

  }

Todo: добавить фильтрацию и проверку пути!


Яндекс.Метрика