PHP - İçerik-Bırakma tam dizin yolunu nasıl ayarlanır?

4 Cevap php

I am passing a filename to a download page.
ie somefile.xls

The download page adds back in the full directory path onto the filename.
ie c:\temp\somefile.xls

The problem is that now setting the 'Content-Disposition' of the header doesn't work. The filename it wants to download is the full directory-filename path. ie c_temp_somefile

İçerik-Disposition tam yolunu ele miyim?

Bu nasıl benim komut düzgün dosyasını indirmek için alabilirim eğer?

Code:

$myad = $_GET['myad'];
$glob_string =  realpath('/foldera/folderb/folderc'). DIRECTORY_SEPARATOR .$myad;

header('Content-Type: application/excel');
$headerstring = 'Content-Disposition: attachment; filename='.$glob_string;
header($headerstring);
readfile($myad);

(Cevaplardan) GÜNCEL kodu:

$myad = $_GET['myad'];
$glob_string =  realpath('/mit/mit_tm/mrl_bol'). DIRECTORY_SEPARATOR .$myad;

header('Content-Type: application/excel');
$headerstring = 'Content-Disposition: attachment; filename='.$myad;
header($headerstring);
readfile($glob_string);

4 Cevap

Başlık dizesi yoluyla tam yolunu geçmek, ancak ($myad) yerine taban adını kullanmayın.

Script (readfile() filtresiz kullanıcı girişi alır) kullanıcıya keyfi yolları geçecek beri gerçekten, $_GET['myad'] daha iyi bir doğrulama kullanmanız gerekir. Bu bir güvenlik açığıdır!

realpath, daha sonra düz bir dosya adını almak için tam yolunda basename() kullanmak, dosya izin klasör içinde olduğundan emin olun kullanarak gerçek yolunu hesaplayın. Content-Disposition başlığı üzerinden bu altdizesine geçmek, ama readfile() için gerçek yolu kullanın.


UPDATE: Güncellenen kod hala bir güvenlik delik içerir. $_GET['myad'] içeriyorsa ../../../some/full/path, script mutlu herhangi bir müşteriye okunabilir dosyasını talep göndermek istiyorsunuz.

Aşağıdaki kod parçasında çizgisinde bir şey kullanmak gerekir:

$myad = $_GET['myad'];

$rootDir = realpath('/mit/mit_tm/mrl_bol');
$fullPath = realpath($rootDir . '/' . $myad);

// Note that, on UNIX systems, realpath() will return false if a path
// does not exist, but an absolute non-existing path on Windows.
if ($fullPath && is_readable($fullPath) && dirname($fullPath) === $rootDir) {
    // OK, the requested file exists and is in the allowed root directory.
    header('Content-Type: application/excel');
    // basename() returns just the file name.
    header('Content-Disposition: attachment; filename=' . basename($fullPath));
    readfile($fullPath);
}

Sen Content-Disposition başlığında istediğiniz hemen her şeyi koyabilirsiniz ama çoğu tarayıcılar, güvenlik nedenlerinden dolayı, görmezden veya değiştirme yolları ve bunlar üzerinde çalışan konum işletim sistemi için geçerli bir dosya onları dönüştürmek olacaktır.

Content-Disposition web istemci bu ayarı saygı için tarayıcı, bu zorunlu değil, sadece bir ipucu.

Yani, hayır, istemci bilgisayarda belirli bir dizine indirmek zorlayamaz.

Asla. Bir tarayıcı tam yolları kabul ederse, hızlı bir hata dosya zamanı: Bu önemli bir güvenlik açığı olacaktır.

Ben bu yardımcı olacağını olmadığını bilmiyorum, ama ben excel belgesi için içerik türü başlığı gerçekten doğru olmayabilir düşünüyorum, kendim denemedim, ama bu microsoft paketleri mouthfull gelir, Mirosoft kelime gibi {[(0 olduğunu )]}