2011-03-05 9 views
0

私はWebサービスを開発しています。このサービスでは、ユーザは.phpファイルをアップロードし、サービスはPHPファイルからUTF8 BOM文字を削除します。そして、そここのようなリンクになります。ファイルをダウンロードするように強制する

<a href="uploads/as8df7/uploadedfile.php">Download Your File</a>

しかし、私は、このファイルには、このリンクは、ブラウザの閲覧をクリックしたとき。私はそれを閲覧したくない、私はそれをダウンロードしたい。したがって、ユーザーがこのリンクをクリックすると、ダウンロードが開始されます。

アイデア?

(私は uploadedfile.phpファイルを変更したくないPS、また、私はこのことについて5つの質問を読んで、それでも私は問題を抱えている。)

+1

'uploadedfile.php'を修正する必要があります。 –

+0

しかし、あなたは 'uploadedfile.php'をダウンロードしますか? – Eray

+1

は、現在の形式でアップロードされたファイルを実行します。これはno-noです。正しいヘッダを送り、ファイルのソースコードを渡すトランスポートスクリプトが必要です –

答えて

1

問題は、人々がPHPをアップロードすることができているということですあなたのサーバー上のファイルを読み込み、PHPファイルを実行するためのリンクを与えます。 WebサーバーはアップロードされたPHPファイルを他のPHPファイルと同じように自動的に処理します。つまり、実行することで大規模なセキュリティホールを開くことができます。

あなたのウェブサービスの目的が何であれ、アップロードしたときにファイルの名前を変更することをお勧めします(拡張子なしで最適なものがあります)。ヘッダが要求されたときに設定されます。

、このようなスクリプトのURLは次のようになります。

http://www.example.com/get_uploaded_file.php?id=jgh3h8gjdj2389 

それは、サーバー上のファイルとidの値をリンクする、とあなたは元のファイル名のどこか(フラットファイル、DBを保存した場合)、正しいHTTPヘッダーを設定していれば、元の名前を使って配信することができます。

4

あなたは、このHTTPヘッダーを提供する必要があります。

Content-Disposition: attachment; filename=example.txt 

あなたは通常、適切なWebサーバーを設定することにより、一度にディレクトリ全体のためにこれを指定することができます。あなたが使用しているWebサーバーについて言及している場合は、誰かがこれを行う方法を提案することができます。

0

PHPファイルに直接リンクすると、実行が終了することがあります。 1つの方法は、(上記の誰かのように)名前を変更することです。それとも、あなたは下記んdownloader.php持つことができます。

<?php 
header('Cache-Control: no-cache, must-revalidate'); 
header('Expires: Mon, 01 Jan 2000 01:00:00 GMT'); // some date in past 
header('Content-type: text/plain'); 
header('Content-Disposition: attachment; filename='.basename($filepath)); 
header('Content-Length: ' . filesize($filepath)); 
flush(); // or any other flush function/mechanism you use. 
readfile($filepath); 

をし、それが何かのようにリンクされています <a href="./downloader.php?fileid=4ba213">Download</a>

この方法は、あなたが.php拡張子を保持できるようになります。また、PHPファイルが大きく、接続が遅い場合は、コンテンツの長さを先にフラッシュしたため、progress-barが正確になります。

関連する問題