Webroota dışında dosyaları yükleyin

4 Cevap php

Ben Shopmanager sisteme dosya yüklemek gerekir, bir alışveriş sistemi geliştiriyorum. Bu dosyalar bir ücret için satılabilir ve sadece satın alma kod sağlama yoluyla erişilebilir olmalıdır.

Bütün alım kodu ve yükleme şey iyi çalışıyor. Sadece dosyaya doğrudan erişimi engellemek zorunda.

Questions:

  • Nasıl Kullanıcıların oradan / okuma indir webroota dışında yüklemek ama izin verebilir?
  • Ya da nasıl kullanıcıların bir dizine yüklemek için izin yok ama kimse ondan / indirme okuyabilir?

Ben bir form üzerinden dosya yüklemek için bu gibi Apache ve kullanım kodu koşuyorum:

 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 Cevap

Eğer move_uploaded_file işlevini kullanarak istediğiniz şimdiye kadar sadece webserver hedef dizinde yazabilirsiniz emin olun nerede yükleyebilirsiniz.

Eğer dosyayı okumak ve tarayıcıya geçecekti bir komut dosyası oluşturmak zorunda sonra bu kadar emin kullanıcı dosyayı ödemiş yapabilirsiniz.

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;

?>

Ayrıca kullanıcı, dosya almak için $ _GET değişkeni sizin sunucunun her dosya kullanamazsınız emin olun içerik türü hakkında dikkatli olmak zorunda.

Bu aslında oldukça kolay. Sadece dosyaları için bir dizin oluşturmak ve yazmak için apache izinleri verin. Eğer move_uploaded_file() işlevini çağırdıklarında o zaman sadece bu dizinin hedef belirleyebilirsiniz. PHP tarayıcıyı kullanarak kullanıcıların Apache erişim onları sağlayacak ne sadece sınırlı olacak ise bu yüzden, bu dizine erişmek mümkün olacak sunucu tarafında çalışır.

Hiç bu dosyaları indirmek için gerekiyorsa, sadece bir URL parametresini (ya da bir şey) ayrıştırmak ve dosyaları dizinden dosya almak ve tarayıcıya itecektir bir komut dosyası oluşturun.

Bir .htaccess dosyası kullanmak veya yükleme dir doğrudan erişime izin değil apache.conf yapılandırmak.

<Directory /path/to/upload/dir>
   Order Deny,Allow
   Deny from All
</Directory>

Muhtemelen webroot dışında dosyaları kaydetmek için, dosyayı güvence açısından kolay olacaktır. Biri indirmek istediği zaman, http_send_file onlara geri dışarı dosya göndermek için kullanabilirsiniz.