1

こんにちは、ファイル「アップロード」からファイルをダウンロードしようとしています。シンコーブを使用しているのですが「すみません、ファイルが存在しないようです」という結果になってしまいました。

ここに私の電話があります

<a href="download.php?filename=<?php $row4['Arxeio'] ?>">Click here
to Download the File</a>

およびdownload.php

<?php  session_start();

$filename = $_GET['filename'];

$download_path = './upload/';

if(eregi("\.\.", $filename)) die("I'm sorry, you may not download that file.");

$file = str_replace("..", "", $filename);
// Make sure we can't download .ht control files. if(eregi("\.ht.+", $filename)) die("I'm sorry, you may not download that file.");

// Combine the download path and the filename to create the full path to the file. $file = '$download_path$filename';

// Test to ensure that the file exists. 
if(!file_exists($file)) die("I'm sorry, the file doesn't seem to exist.");
// Extract the type of file which will be sent to the browser as a header
$type = filetype($file); // Get a date and timestamp $today = date("F j, Y, g:i a"); $time = time(); // Send file headers header("Content-type: $type"); header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary"); 
header('Pragma: no-cache'); 
header('Expires: 0'); // Send the file contents.
set_time_limit(0); 
readfile($file);
?>
4

1 に答える 1

3

echoHTML では、出力に書き込むファイル名が必要です。

<a href='download.php?filename=<?php echo $row4['Arxeio']; ?>'>Click here to Download the File</a>

PHP でファイル名を受け取ったら、ディレクトリ トラバーサル攻撃に対して検証する必要があります。/またはが含まれていないことを確認します..eregi()(ちなみに、これは非推奨です)を使用した初歩的なテストがありますが、 strpos().

if (strpos($filename, "..") >= 0 || strpos($filename, "/") >= 0) {
  // Error! don't permit file download
}

NULLバイト攻撃保護に関する PHP のドキュメントも参照してください。

ただし、$filenameダウンロード用の有効なファイル名のホワイトリストと比較することをお勧めします。

if (in_array($filename, array('file1.jpg', 'file2.txt', 'file3.mov',...)) {
  // Ok, send the file.
}
else {
  // Invalid file
}
于 2012-08-05T22:03:56.860 に答える