Загружать файлы вне webroot - PullRequest
       4

Загружать файлы вне webroot

0 голосов
/ 16 сентября 2009

Я разрабатываю систему покупок, в которой shopmanager должен иметь возможность загружать файлы в систему. Эти файлы могут быть проданы за плату и должны быть доступны только через код покупки.

Весь код покупки и загрузки отлично работает. Просто нужно заблокировать прямой доступ к файлу.

Вопросы:

  • Как я могу разрешить пользователям загружать файлы вне webroot, но не читать / скачивать оттуда?
  • Или Как разрешить пользователям загружать в каталог, но никто не может читать / скачивать из него?

Я использую Apache и использую такой код для загрузки файлов через форму:

 public function upload_file($file='',$post_value='',$path) {
  if ($_FILES[$post_value]) {
      $uploadext = strtolower(strrchr($_FILES[$post_value]['name'],"."));
      if($uploadext=='.jpg' || $uploadext=='.gif' || $uploadext=='.png' || $uploadext=='.swf' || $uploadext=='.jpeg' || $uploadext=='.pdf' || $uploadext=='.doc' || $uploadext=='.xls' || $uploadext=='.docx') {
    $destination = $path.$file.$uploadext;
       move_uploaded_file($_FILES[$post_value]['tmp_name'], $destination);
   } else {
    echo PICTURE_ERROR;
   }
  }
  return $file.$uploadext;
 }

Ответы [ 4 ]

4 голосов
/ 16 сентября 2009

вы можете загрузить куда угодно, используя функцию move_uploaded_file, просто убедитесь, что веб-сервер может записывать в каталог назначения.

После того, как вам нужно будет создать скрипт, который будет читать файл и передавать его в браузер, чтобы вы могли убедиться, что пользователь заплатил файл.

Exemple

<?php
// insert your logic here to verify the user has access to this file.
// open the file in a binary mode
$name = 'yourfile';

$fp = fopen($name, 'rb');

// send the right headers
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));

// dump the picture and stop the script
fpassthru($fp);
exit;

?>

Вы должны быть осторожны с типом содержимого, а также убедиться, что пользователь не может использовать каждый файл на вашем сервере, если вы используете переменную $ _GET для получения имени файла.

0 голосов
/ 16 сентября 2009

С точки зрения защиты файла, вероятно, было бы проще всего сохранить файлы вне вашего webroot. Если кто-то захочет загрузить его, вы можете использовать http_send_file , чтобы отправить ему файл обратно.

0 голосов
/ 16 сентября 2009

используйте файл .htaccess или настройте его в apache.conf, чтобы запретить прямой доступ к каталогу загрузки.

<Directory /path/to/upload/dir>
   Order Deny,Allow
   Deny from All
</Directory>
0 голосов
/ 16 сентября 2009

Это на самом деле довольно легко. Просто создайте каталог для ваших файлов и дайте разрешения Apache для записи в него. Затем, когда вы вызываете функцию move_uploaded_file(), вы можете просто указать место назначения для этого каталога. PHP работает на стороне сервера, поэтому он сможет получить доступ к этому каталогу, в то время как пользователи, использующие браузер, будут ограничены только тем, что Apache разрешит им получить доступ.

Если вам когда-нибудь понадобится загрузить эти файлы, просто создайте сценарий, который будет анализировать параметр URL (или что-то еще), взять файл из каталога файлов и передать его в браузер.

...