Безопасность в скрипте для отдачи файлов

Савелей

Новичок
Безопасность в скрипте для отдачи файлов

PHP:
require_once("_config_inc_scan_dir.php");

$directory = (isset($_GET['directory']) ? $_GET['directory'] : "");
$filename  = (isset($_GET['filename']) ? $_GET['filename'] : "");
$filename  = basename($filename);

if(!empty($filename) ? $filename : die);

$ext = substr(strrchr($filename, '.'), 1);
$ext = strtolower($ext);

if (is_array($MY['DENY']))
 {if ((in_array($ext, $MY['DENY'])) || (!in_array($ext, $MY['LIST']))) die('ERROR: DENY ALL FILE, IP BLOCK');
 }
else
 {die('ERROR: DENY FOR ALL');
 }

// Определяем дир.
$current_dir = FILE_DIR;
if ($directory != '')
 $current_dir.="/$directory";

if (!file_exists("$current_dir/$filename"))
 {
  Header("HTTP/1.0 404 Not Found");
  echo "<div align=\"center\">Недоступен</div>";
  exit();
 }
else
 {
  $size = filesize("$current_dir/$filename");
  //Forzo il salvataggio con un determinato nome
  header("Content-Type: application/force-download; name=\"$filename\"");
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: $size");
  header("Content-Disposition: attachment; filename=\"$filename\"");
  header("Expires: 0");
  header("Cache-Control: no-cache, must-revalidate");
  header("Pragma: no-cache");

  @readfile("$current_dir/$filename");
  exit();
 }

$MY['DENY'] содержит запрещенные ext
$MY[LIST] содержит разр. ext

где 'ERROR: DENY ALL FILE, IP BLOCK будет блокировать IP
Прошу Вас как профи в php кодинге проверить на безопасность.
Что я еще упустил...
 

Wicked

Новичок
Савелей
> $filename = basename($filename);

если в $filename есть слэши, сразу можно банить.

> if(!empty($filename) ? $filename : die);

wtf?

> if ((in_array($ext, $MY['DENY'])) || (!in_array($ext, $MY['LIST'])))

не понятно, зачем 2 списка. а если расширение будет в обоих или ни в одном из?

> @readfile("$current_dir/$filename");
> ?directory=../../../etc&file=.passwd

почитай про open_basedir директиву. либо выкручивайся с помощью realpath().
 

Савелей

Новичок
что я из этого понял,

1)ну насчет ../../ это я просто выше проверку не вставил там есть функция которая режит ../../ .. ./

2)юзать realpath() да что то я с ней так и не разобрался:(

3)2 списка сменить на один и проверять есть в них что...

4)банить если слеши есть

Вроде все, спасибо всем.
 
Сверху