6

ファイル名をダウンロード ページに渡しています。
すなわち somefile.xls

ダウンロード ページでは、完全なディレクトリ パスがファイル名に追加されます。
すなわち c:\temp\somefile.xls

問題は、ヘッダーの「Content-Disposition」の設定が機能しないことです。ダウンロードするファイル名は、ディレクトリとファイル名の完全なパスです。 すなわち c_temp_somefile

Content-Disposition はフル パスを処理できますか?

スクリプトでファイルを適切にダウンロードするにはどうすればよいですか?

コードは次のとおりです。

$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);

更新されたコード(回答から):

$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

4 に答える 4

10

ヘッダー文字列を介してフル パスを渡さないでください$myad。代わりにベース名 ( ) を使用してください。

$_GET['myad']スクリプトは任意のパスをユーザーに渡すため (readfile()フィルター処理されていないユーザー入力を取得するため) 、より適切な検証を実際に使用する必要があります。これはセキュリティホールです!

を使用して実際のパスを計算しrealpath、ファイルが許可されたフォルダー内にあることを確認してからbasename()、フル パスで を使用してプレーン ファイル名を取得します。この部分文字列をContent-Dispositionヘッダー経由で渡しますが、実際のパスを使用してreadfile()ください。


更新:更新されたコードにはまだセキュリティ ホールが含まれています。$_GET['myad']含まれている場合../../../some/full/path、スクリプトは要求された読み取り可能なファイルをクライアントに喜んで送信します。

次のスニペットの行に沿って何かを使用する必要があります。

$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);
}
于 2009-11-18T17:10:14.787 に答える
9

必要なものはほとんどすべてヘッダーに入れることができますContent-Dispositionが、ほとんどのブラウザーは、セキュリティ上の理由から、パスを無視または置換し、実行しているオペレーティング システムの有効なファイル名に変換します。

Content-Dispositionブラウザへのヒントに過ぎず、Web クライアントがこの設定を尊重することは必須ではありません。

したがって、いいえ、クライアント コンピューターの特定のディレクトリにダウンロードを強制することはできません。

于 2009-11-18T17:10:29.527 に答える
3

Never ever. If a browser accepts full paths it is time to file a bug, quickly: this would be a major security hole.

于 2009-11-18T17:09:56.097 に答える
0

これが役立つかどうかはわかりませんが、Excel ドキュメントの content-type ヘッダーは実際には正しくない可能性があると思います。自分で試したことはありませんが、これらの Microsoft パッケージは、mirosoft の単語のように口一杯になります。
application/vnd.openxmlformats-officedocument.wordprocessingml.document

于 2013-04-14T22:22:41.913 に答える