5

私は2つのサーバーを持っています。サーバー 1 には、WordPress Web サイトがあります。サーバー 2 には、WordPress サイトのメンバーがダウンロードできるようにしたい大きな .zip ファイルがあります。

これらのユーザーを認証して、Web サイトのメンバーだけが 2 番目のサーバーからファイルをダウンロードできるようにするにはどうすればよいですか?

自分のドメインからのリファラーだけがファイルにアクセスできるように PHP を使用することはできますか?

注: ファイルをダウンロードするためのリンクは wordpress サイトで保護されているため、ログインしていないユーザーは参加ページにリダイレクトされます。ただし、現在および元のメンバーは、ダウンロードがあるディレクトリを引き続き知っているため、ファイルをダウンロードしたり、リンクを共有したりする可能性があります。

4

2 に答える 2

6

これにはいくつかの方法があります。最も安全な方法は、サーバー 1 とサーバー 2 の間で何らかのバックエンド通信を行うことです。しかし、簡単な代替手段を次に示します。

サーバー 2: download.php

<?PHP
 $file = $_GET['f'];
 $code = $_GET['c']; 
 $ip = $_SERVER['REMOTE_ADDR'];

 if ($code != md5($ip . 'salt')) {
    die('authentication denied');
 }

 if(!file)
 {
     die('file not found');
 }

 // Set headers
 header("Cache-Control: public");
 header("Content-Description: File Transfer");
 header("Content-Disposition: attachment; filename=$file");
 header("Content-Type: application/zip");
 header("Content-Transfer-Encoding: binary");

 // Read the file from disk
 readfile('/files/downloads/' . $file);

?>

サーバー 1 : ダウンロード リンク

<?PHP
 echo '<a href="http://server2.com/download.php?f=text.txt&c=' . md5($_SERVER['REMOTE_ADDR'] . 'salt') / '">Download File</a>';
?>

このシステムは、生成された IP でのみ使用できるリンクを作成することによって機能します。したがって、登録ユーザーはリンクを他の場所で共有することはできません。これは最も安全なものではありませんが、実装が簡単で機能します。

于 2012-06-09T21:07:33.683 に答える
1

適切な解決策として、現在の時刻に基づくトークン システムを使用することがあります。1 日の現在の時間を取り、それをソルトでハッシュし、トークンとしてクエリ文字列に入れることができます。2 番目のサーバーの php スクリプトよりも、サーバー側で同じソルトを使用してその日の現在の時間に対して生成されたハッシュと同じかどうかを確認できます。

ユーザーが時間の切り替え時刻に達しないようにするために、前の時間のハッシュも確認できます。

これにより、ファイルの URL が 2 時間以上使用できないことが保証され、1 時間の使用可能時間が保証されます。

サーバー 1:

<?php
echo '<a href="server2.com/download.php?token='.md5(date('G')+'secret_word').'&file=file.zip">Link</a>';
?>

サーバー 2:

<?php
current_hour_hash = md5( date('G').'secret_word' );
previous_hour_number = ( int(date('G')) - 1 ) % 24;
previous_hour_hash = md5( str(previous_hour_number).'secret_word' );
if($_GET['token']!= current_hour_hash and $_GET['token']!= previous_hour_hash){
    die();
}else{
    ... //code sending file here
}
于 2012-06-09T22:06:36.173 に答える