8

ホットリンカーからファイルを保護するための一時的なダウンロードリンクのプロジェクトを作成しています...

これは可能だと思います。ファイル共有サイトの多くは「何も言及したくない」ことを知っているので...ファイルへのリンクには有効期限があります...

元。

私が彼らのサイトから1つのファイルをダウンロードすると、彼らはそれを正しくクリックするための直接リンクを提供しますか?ただし、そのリンクは数時間または数分後に期限切れになります。

リンクの有効期限が切れたことをどのように知る必要がありますか?1日後にダウンロードマネージャーで同じリンクをコピーすると、同じファイルをダウンロードできなくなります。

私はすでにこれをで可能にしましたhtaccess

元。

RewriteRule .*\.(rar|ZIP)$ http://domain.com [R,NC]

ブラウザのアドレスバーに直接リンクをコピーすると、http://domain.comにリダイレクトされます。

ただし、ダウンロードマネージャーに直接リンクをコピーすると、ファイルがダウンロードされます。

フォーラムのウェブサイトやブログなどの他のサイトにリンクを投稿し、読者にリンクをコピーしてダウンロードマネージャーに貼り付けて、直接ダウンロードできるようにした場合はどうなりますか。

これは、ファイルを保護するために防止したい問題です。私はこれをPHPで行っていますが、理解できません...

あなたの助けは非常にありがたいです。

4

5 に答える 5

24

のようなものにリンクします/downloads/abb76b3acbd954a05bea357144d614b4abb...は、現在の時刻のソルト ハッシュなどのランダムな文字列です。誰かのためにこのリンクを作成するときは、ランダムな文字列をデータベース テーブルに保存します。このテーブルは次のようになります。

+----+-------------+----------------------------------+---------------------+---------------------+
| id | filename    | token                            | created             | modified            |
+----+-------------+----------------------------------+---------------------+---------------------+
|  1 | image.jpg   | abb76b3acbd954a05bea357144d614b4 | 2012-03-26 19:36:41 | 2012-03-26 19:36:41 |
|  2 | program.exe | 19660d0f5e0ca3d42e1718de5d0a1d7e | 2012-08-29 11:07:58 | 2012-08-29 11:07:58 |
+----+-------------+----------------------------------+---------------------+---------------------+

でリクエストを受け取ったら/downloads/...、ランダムな文字列を調べて、正しいファイルを送り返します。タイムスタンプが古すぎる場合はcreated、そうしないでください。cronjob を使用して古いテーブル行を消去するか、あまり理想的ではありませんが、誰かが にリクエストを行うたびにこれを実行し/downloads/...ます。

于 2012-09-26T01:34:37.210 に答える
2

このようなコードを使用してください

 $path="uploads/";
                  $actualfilename=$path.$filename;
                  $fakefilename="downloadfile.pdf";
                   if($typeofview=="download") {
                          @readfile($actualfilename);
                        header('Content-type: application/pdf');
                        header('Content-Disposition: attachment; filename="' . $fakefilename . '"');
                        header('Content-Transfer-Encoding: binary');
                        header('Content-Length: ' . filesize($actualfilename));
                        header('Accept-Ranges: bytes');
                        exit;

これを .htaccess ファイルに追加します

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule fakefile.php(.*)$ orignalfile.php?$1 [L,QSA]
于 2012-09-25T11:10:09.253 に答える
0

私の頭に浮かぶ解決策は次のとおりです。ファイルを表すテーブルがあり、たとえばFileModelがある場合は、ファイルの名前、詳細、サイズ、ファイルシステム内のファイルへのパス、および一意のファイルを保存できます。たとえば、いくつかのファイルの詳細に基づいて選択したいくつかのデータからのmd5の結果になります。

$data[FileModel]['unique'] = md5(time() . $data[FileModel]['file']);

誰かにファイルをダウンロードさせる前に、テーブルにそのような一意の値があるかどうかを確認します。その場合は、FileModelで作成されたur downloadFileメソッドを使用してファイルをダウンロードさせますが、その直前に、それ以上ダウンロードされないように新しい一意の値を作成します。

$data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']);
$this -> FileModel-> save($data[$this -> name]);
$this -> FileModel -> downloadFile($data[$this -> name]);

urデータベースにそのような一意の値がない場合は、ユーザーへのタイムアウトされたリンクに関するエラーを表示するだけです。

$this -> setFlashError('link expired');

ここでは、コントローラーで開始できるアクションのプロトタイプの例を紹介します。

function download($file_data = ''){
        $data = $this->FileModel->find('first', array('conditions' => array('FileModel.unique' => $file), 'fields' => array('*')));

        if(!is_array($data[FileModel])) $this -> setFlashError('link expired');

        else
        {
            $data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']);
            $this -> FileModel-> save($data[$this -> name]);
            if(!$this -> FileModel -> downloadFile($data[$this -> name]))
            {
                $this -> setFlashError('error'));
            }
        }
}

また、日時フィールドを作成して、たとえば現在の日付に1日を追加し、ダウンロードの残り時間が経過したかどうかを確認することもできます。

于 2012-09-25T13:04:47.210 に答える
0

私が見つけたもの:

header('Content-Type: application/force-download');
$filee = "your_file.txt";
$filesLocation = dirname(__file__).'/the_sub_folder_for_the_file/'.$filee;
header('Content-Length:' . filesize($filesLocation));
header("Content-Disposition: inline; filename=\"".$filee."\"");
$filesPointer = fopen($filesLocation,"rb");
fpassthru($filesPointer);
于 2013-06-25T17:04:47.237 に答える