4

私は現在、基本的にさまざまなファイルの販売を伴うクライアント向けのWebサイトを作成しています。これは明らかに本当に一般的なことであり、それを行う方法を考えないことに対して私は一種の愚かさを感じさせます。

購入が完了すると、顧客はダウンロードリンクを含むページに移動する必要があります。また、ダウンロードリンクを含む電子メールと、作成されるアカウントに関する情報が記載された電子メールを受信する必要があります(顧客は次のこともできます)。アカウントのコントロールパネルからダウンロードします)。私が理解しようとしているのは、サーバー上のファイルの場所を非表示/隠して、ファイルを購入した人がファイルへの直接リンクを他の場所にコピーして貼り付けることができないようにする方法です。ファイルのダウンロードをリクエストしても、http://example.com/blah/download/454643の形式のリンク、ファイルの実際の場所に対応していないURLですが、サーバー上でファイルを見つけることはまだ可能だと思いますか?サーバーでアクセス許可がどのように機能するかについてはあまり理解していません。そのため、私は質問します。前もって感謝します :)

4

8 に答える 8

8

基本的に、ユーザーにファイルへの直接URLを提供しません。サーバーベースの権限は、ここでは何の関係もありません。

必要なファイルが/data/files/file.pdfに保存されているとします(Webルートからファイルを保存することをお勧めします)。/download.php?auth=32のようなダウンロードへのリンクをユーザーに提供できます

ユーザーがリンクをクリックすると、download.phpはセッション/ Cookieが認証されているかどうか、ダウンロードIDが有効かどうかを確認します(時間ベースのダウンロードの有効期限がある場合)。次に、download.phpはその場所から必要なファイルを読み取り、送信します。ダウンロードを強制するために適切なヘッダーを付けてブラウザに送信します。

于 2008-10-16T23:40:38.487 に答える
5

ファイルを Web ルートの外に保存しますが、保存するフォルダーが php.ini ファイルの「open_basedir」ディレクティブにあることを確認してください。これにより、PHP スクリプトからファイルにアクセスできるようになります。それらを Web ルートの外に格納すると、HTTP 経由で直接アクセスされることはありません。

これらの回答にリストされているような、ファイルをストリーミング/読み取ることができるPHPスクリプトを用意してください。ファイルが大きい場合は、スクリプトがファイルを読み取るのにかかる余分な時間を考慮して、「max_execution_time」を変更する必要がある場合があります。このスクリプトを使用すると、ユーザーを認証し、ユーザーがファイルの代金を支払ったことを確認できます。

そのフォルダーから要求されたファイルを変数に書き換えるスクリプトを使用して、フォルダーに .htacces を配置します。これにより、ファイルに直接アクセスしているように見えますが、そうではありません。個人的には、単純にするために、このフォルダーには単一のスクリプトのみを配置します。そう:

http://www.yourdomain.com/files/expensive_song.mp3

実際には次のように書き換えます。

http://www.yourdomain.com/files/download_file.php?filename=expensive_song.mp3

幸運を。

于 2008-10-17T07:37:10.100 に答える
2

Lighttpdの実行にアクセスできる場合は、Mod_SecDownloadモジュールを必ず確認してください。私はこれを、ビデオファイルと画像ファイルを安全に販売した以前のプロジェクトで使用しました。

ウェブサーバーはアプリで使用される権限について何も知らないため、結果のURLは、そのURLを知っているすべてのユーザーが利用できます。

mod_secdownloadは、指定された時間の間URLを認証する方法を導入することにより、この問題を取り除きます。アプリケーションは、ファイルをWebサーバーでダウンロードできるようにする前に、Webサーバーによってチェックされるトークンとタイムスタンプを生成する必要があります。

生成されるURLの形式は次のとおりです。

<uri-prefix> / <token> / <timestamp-in-hex>/<​​rel-path>は「yourserver.com/bf32df9cdb54894b22e09d0ed87326fc/435cc8cc/secure.tar.gz」のようになります

<token>はのMD5です

  1. シークレット文字列(ユーザー提供)
  2. (/で始まります)
  3. <16進数のタイムスタンプ>

ご覧のとおり、トークンはユーザーにまったくバインドされていません。唯一の制限要因は、特定のタイムアウト(secdownload.timeout)の後にURLを無効にするために使用されるタイムスタンプです。

于 2008-10-17T01:32:21.773 に答える
1

これは、私が非常によく似たものに対して行ったことのサンプルコードです。

// $mimeType is the mime type of the file
header('Content-type: ' . $mimeType);
// this will get the size of the file
// (helps for giving the size to the browser so a percent complete can be shown)
header('Content-length: ' . (string) (filesize($path)));
// disposition is either attachment (for binary files that can't be read by the browser) 
// or inline (for files that can be read by the browser
// some times you have play with this to get working so users get the download window in all browsers
// original filename is the name you want to users to see 
// (shouldn't have any special characters as you can end up with weird issues)
header('Content-Disposition: ' . $disposition . '; filename=' . $originalFilename);
// the next 2 lines try to help the browser understand that the file can't be cached
// and should be downloaded (not viewed)
header('Pragma: Public');
header('Cache-control: private');
// this will output the file to browser
readfile($path);

もちろん、これにログインチェックとロギングを追加して、何度もダウンロードされないようにすることができます。

また、前述のように、ファイルをWebサーバーのドキュメントルートの外側(または上)に配置して、他のユーザーがパスを理解できないようにします。または、ディレクトリにパスワードを設定して、内部の人だけがファイルリストに簡単にアクセスできるようにすることもできますが、これはお勧めしません。(これは、ドキュメントルートの外に何かを配置できる場合にのみ実行してください。)

于 2008-10-17T02:09:50.620 に答える
1

URLを購入者の認証コードにすることができます。彼女に再度ログインしてもらい、コードの対象となるファイルを確認してから、ファイルを彼女にパイプします。これはosCommerceからのPHPコードの例です(私はずっと前にそれを書きました)。

// Now send the file with header() magic
  header("Expires: Mon, 26 Nov 1962 00:00:00 GMT");
  header("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
  header("Cache-Control: no-cache, must-revalidate");
  header("Pragma: no-cache");
  header("Content-Type: Application/octet-stream");
  header("Content-disposition: attachment; filename=" . $downloads['orders_products_filename']);

  if (DOWNLOAD_BY_REDIRECT == 'true') {
// This will work only on Unix/Linux hosts
    tep_unlink_temp_dir(DIR_FS_DOWNLOAD_PUBLIC);
    $tempdir = tep_random_name();
    umask(0000);
    mkdir(DIR_FS_DOWNLOAD_PUBLIC . $tempdir, 0777);
    symlink(DIR_FS_DOWNLOAD . $downloads['orders_products_filename'], DIR_FS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename']);
    if (file_exists(DIR_FS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename'])) {
      tep_redirect(tep_href_link(DIR_WS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename']));
    }
  }
于 2008-10-16T23:43:28.637 に答える
1

Lighty や Nginx などの一部の Web サーバーは、X-Sendfile ヘッダーを実装しています。Django アプリを持っているとしましょう。送信したいファイルを指す X-Sendfile ヘッダーをビューに返すことができます。lighttpd は代わりにそのファイルを提供します。

ファイルは Web からアクセスできない場所にある可能性があり (これは 301 リダイレクトではありません)、アプリがヘッダーを提供しているため、最初に承認を行うことができます。

これは、アプリケーションから静的ファイルを提供するよりもはるかに優れています。ウェブサーバーは静的ファイル用に最適化されており、より高速になり、リソースが大幅に削減されます。少数のリクエストを処理している場合は、X-Sendfile の使用を検討する必要があります。

ここにそれについての非常に良いブログ投稿があります:

http://blog.zacharyvoase.com/2009/09/08/sendfile/

Lighttpd/PHP の手順は次の場所にあります。

http://redmine.lighthttpd.net/wiki/1/X-LIGHTTPD-send-file

NGINX の手順は次の場所にあります。

http://wiki.nginx.org/XSendfile

同じことを行う初期リリースの Apache mod もあるようです。

https://tn123.org/mod_xsendfile/

于 2011-11-18T09:53:07.833 に答える
0

私が見た購入に基づくダウンロードURLの多くは、URLの一部としていくつかのGUIDやその他の動的情報を使用して、1つのIDを推測するほど単純にしない傾向があります。パスの一部として、guid / datetimepurchased/idなどになってしまう可能性があります。

追加のオプションは、ダウンロードの続行を許可する前にユーザーがログインしていることを確認することです。これにより、セキュリティがさらに強化されます。

于 2008-10-16T23:38:08.493 に答える
0

まず、ファイルに直接リンクしたくないことは間違いありません。特定の基準が満たされている場合は、生成されたid引数を使用して、作成したサービス(またはページのみ)へのリンクをユーザーに送信して、ファイルをダウンロードすることをお勧めします。

ユーザーがファイルを複数回ダウンロードできるようにする必要があるため(ユーザーが最初に完全なファイルをダウンロードできなかった場合や、誤ってファイルを削除した場合など)、これらの基準は実際には困難ですが、リンクが機能すると、あなたがそれを殺すまでそれは働きます。

時間またはIPを使用してダウンロードリクエストをフィルタリングすることをお勧めします。

時間:誰かがあなたからファイルを購入するとき、彼らが1日だけ、またはそのようなものでファイルをダウンロードすることができるであろうことを彼らに知らせてください。はい、他の人はその日中にファイルをダウンロードできますが、1日だけです。これにダウンロード制限を設定して、5回しかダウンロードできないようにすることもできます(これは正常です)。

IP:誰かがあなたからファイルを購入したら、そのIPからのみファイルをダウンロードできることを伝えます。ダウンロードサービスは、ファイルをダウンロードしようとしたときに、これを確実に確認できます。

どちらも同時に使いやすいようです。

どちらの場合(または両方)でも、時間内にファイルをダウンロードしなかった顧客、または制限時間後に(または別のコンピューター/ IPから(静的なものを取得しない)別のコンピューター/ IPから)ファイルを再度取得したい顧客を処理する準備をしてください。 )。彼らは二度と支払いたくないでしょう、そしておそらくそうする必要はないはずです。

于 2008-10-16T23:39:16.603 に答える