Handler bozuk dosyaları geri Dosya

2 Cevap php

For the past 3 months my site has been using a PHP file handler in combination with htaccess. Users accessing the uploads folder of the site would be redirected to the handler as such:

RewriteRule  ^(.+)\.*$ downloader.php?f=%{REQUEST_FILENAME} [L]

Dosya işleyicisi amacı sözde, aşağıda kodlu gerçek kodu tarafından takip edilmektedir.

//Check if file exists and user is downloading from uploads directory; True.
//Check against a file type white list and set the mime type(); $ctype = mime type;
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");

Dün itibariyle, işleyici bozuk dosyaları, okunmaz görüntüleri dönen başladı ve bypass gerekiyordu. Ben bu neden ters gitmiş olabilir ne ayarları merak ediyorum.

-EDIT-

Sorun bulundu, ama çözülmüş değil. Ben Wordpress dosyaları bozarak edilmiştir ile entegre etmek için kullanan bir php kütüphanesine bir yolu da dahil olmak üzere. Bu kod bloğunu Çıkarma yolsuzluk sorunu çözer ama istenen kimlik doğrulama olmadan erişilebilen dosyaları bırakır.

  @include_once($_SERVER['DOCUMENT_ROOT'].'/wp-blog-header.php');
  if(!is_user_logged_in()) 
  {
    auth_redirect(); //Kicks the user to a login page.
  }

  //resume download script

2 Cevap

Belki daha fazla testler sorunu ortaya çıkaracaktır ...

if ( !isset($filename) ) {
  die('parameter "filename" not set');
}
else if ( !file_exists($filename) ) {
  die('file does not exist');
}
else if ( !is_readable($filename) ) {
  die('file not readable');
}
else if ( false===($size=filesize($filename)) ) {
  die('stat failed');
}
else if ( headers_sent() || ob_get_length()>0) {
    die('something already sent output.');
}
else {
  $basename = basename($filename);

  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  header("Cache-Control: private",false); // required for certain browsers
  header("Content-Type: $ctype");
  header("Content-Disposition: attachment; filename=\"".$basename."\";" );
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: ".$size);
  readfile($filename);
}

Nasıl dosyaları bozuk? Kesik? 0 bayt? Tamamen farklı içerik? Rastgele bölümleri çöp ile değiştirilir?

Mümkün sunucunun PHP bellek limiti düşürülmüştür mı? readfile () çıktılamak önce bellekteki tüm dosyayı tampon olacaktır. Bu nedenle 40meg dosya başarısız olur bellek sınırı tür şey, 39,9999 olmasıdır.

Kullanıcıya dosya akışı için, onlar hafıza limiti tüm konu konum olarak, işlevleri "tarayıcı döküm dosyası" php kendi KULLANMAYIN en iyisidir. Bu bir fopen / fwrite / fclose döngü yapmak ve küçük yönetilebilir parçalar (4k, 16k, vb ..) dosya tükürmek için en iyisidir.