web-dev-qa-db-ja.com

Webサーバーにファイルを保存する安全な方法は?

Webサーバーでファイルを安全に保ちたい。これらのファイルにアクセスできるのは、これらのファイルにアクセスするために認証されたユーザーのみです。データベースにファイルを「LongBLOB」として保存することを考えましたが、最大2MBのデータしかサポートしていません。ファイルサイズは50MBを超える場合があります。ファイルを保護するための他のより良い方法はありますか?助けてください。よろしくお願いします。

19
brainless

それらをデータベースに保存しないでください。それらをWebディレクトリに置き、 .htaccess

他の方法で認証する場合は、Webにアクセスできないが、phpが実行するユーザーが読み取り可能なディレクトリにファイルを保存します。

23
marcog

いくつかのオプションが思い浮かびます。

Apacheを使用している場合は、htaccessを使用してディレクトリをパスワードで保護できます。 (最初のグーグルリンク: http://www.javascriptkit.com/howto/htaccess3.shtml

またはファイルをWebサーバーの上に保存します。許可されたユーザーがそれらにアクセスできるようにするスクリプトをphpで作成します。

FTP経由で実行したい場合で、cpanelを実行している場合は、新しいftpアカウントを作成できる可能性があります。 yourdomain.com/cpanelをチェックして、インストールされているかどうかを確認してください。

5
Jason

DBにファイルを保存することは非常に悪い習慣です。ファイルに関する情報のみを保存することをお勧めします。名前、拡張子。ファイルは$ id。$ extのようにサーバーに保存されます。それは良い建築になるでしょう。そして、ユーザーがファイルをダウンロードするとき、彼はDBに名前のあるファイルを取ります。
英語でごめんなさい。

4
Alex Pliutau

討論

価値の高いダウンロード可能なコンテンツファイルをファイルシステムに直接保持することを選択した場合、最善の方法はそれらをwebroot。次に、アプリケーションは、コンテンツ(PDF、Word文書、曲など)のURL(必要に応じてURLエンコード)を作成する問題を解決する必要があります。

一般に、これは、クエリを使用してファイルパスを取得し、ユーザーがアンカーをクリックしたときにファイルパスを使用してコンテンツをユーザーに送信することで実現できます(header()などを使用)。これは、ユーザーが実際のサーバー側のファイルパスを確認することなく実行できます)。

ユーザーを望まない場合[〜#〜] a [〜#〜]高価値のダウンロード可能なコンテンツのURLをユーザーに共有する[〜#〜] b [〜#〜] =の場合、アプリケーションは何らかの方法でリンクをユーザー専用に関連付ける必要があります[〜#〜] a [〜#〜]。何ができるの?どこから始めればいいですか?

明らかに、ユーザーがファイルをダウンロードする前に、セッション中にユーザー[〜#〜] a [〜#〜]がログインしていることを確認する必要があります。 それほど明白ではないは、ログインユーザーを防ぐ方法です- [〜#〜] b [〜#〜]ユーザーから送信されたURLの使用から[〜#〜] a [〜#〜](ユーザーへ[ 〜#〜] b [〜#〜])ダウンロードするA'sデジタルコンテンツ。

_$_SESSION_を使用してログインユーザーのID(数値、または文字列)を保存し、最終的なクエリのその部分を作成すると(コンテンツがユーザーの購入などに関連付けられていると仮定)、ログインユーザーを防ぐことができます[〜 #〜] b [〜#〜]購入していないものをダウンロードすることから、SQLを処理するためのリソースヒットが発生します購入していない未購入のアイテムの空のセット。これは良いステップ2のように聞こえます。

ステップ1はどうですか?そもそもクエリを実行する必要性を防ぐことができる何かがありますか?

さて、見てみましょう。 HTMLフォームでは、非表示フィールドでXSRFトークンを使用して、送信されたフォームがPOST/GET要求を受信するWebサーバーから実際に発信されたことを確認できます。フォーム全体で1つのトークンが使用されます。

ダウンロードするユーザー固有のもの(アンカー)のページが与えられた場合、クエリ文字列パラメーターの形式で各アンカーのhref属性に単一のトークン(同じトークンですが、ページリクエストごとに異なります)を埋め込んで保存できます。 _$_SESSION_にあるこのトークンのコピー。

これで、ログインしたユーザー[〜#〜] b [〜#〜]がログインしたユーザーA's共有URLを使用しようとすると、ユーザー-が原因ですべてが失敗します。 [〜#〜] a [〜#〜]およびユーザー[〜#〜] b [〜#〜]異なるセッションがある(またはセッションがまったくない)、およびしたがって、異なるトークン。言い換えれば、「私のリンクはあなたのリンクと同じですが、異なります。」アンカーは、ページ、ユーザー、またはコンテンツだけでなく、セッションに関連付けられます。

そのシステムが整っていると、PHPは、データベースを関与させずにコンテンツのリクエストが有効かどうかを判断できます(送信されたトークンを_$_SESSION_のトークンと比較することにより)。 、有効なXSRFトークンの期間/ライフタイムを制限するために_$_SESSION_で時間制限を設定できます。time()関数と基本的な計算を使用するだけです。60分はトークンのライフタイムとして理想的です。この状況ではアンカーをクリックします。クリックしたアンカーのトークンの有効期限が切れている場合は、ユーザーに再度ログインしてもらいます。

概要

ファイルシステム上のファイルを使用し、パスをデータベースに保存する場合は、(少なくとも)次のことも行うようにしてください。

  1. コンテンツディレクトリ(webrootの外部)に適切なファイル権限を適用します。
  2. アップロードされたファイルにはランダムな名前を使用してください。
  3. アップロードからファイルを保存する前に、重複するファイル名を確認してください。
  4. ログインしたユーザーのみが価値の高いコンテンツをダウンロードできるはずです。
  5. セッション固定を阻止する効果的な_$_SESSION_システムを用意します。
  6. ハッシュ化されたXSRFトークンを使用して、価値の高いダウンロード可能なコンテンツのURLをページごとに一意にします。
  7. XSRFトークンは、端末の寿命がある場合、より多くのシナリオをカバーします。
  8. 製品だけでなく、ログインしたユーザーのIDに基づいてユーザーコンテンツのSQLクエリを実行します。
  9. すべてのユーザー入力をフィルタリングして検証します。
  10. SQLクエリでプリペアドステートメントを使用します。
3

ダウンロード可能なファイルは、htaccessで保護されたフォルダに保存できます。以下のようなスクリプトを使用して、ダウンロード可能なファイルの動的リンクを生成できます。

例安全なダウンロードリンク。 http://codecanyon.net/item/secure-download-links/309295

1
Anupam Rekha

最良の方法は、ファイル参照をデータベースに保存することです。ファイル自体はサーバーファイルシステムに保存されます。これの複雑さは、データベースファイル参照とサーバーファイルシステム内の既存のファイルとの間に参照整合性があることを確認することです。 SQL Server 2008などの一部のデータベースには、実際のファイル自体へのファイル参照の整合性を維持する機能があります。

それ以外に、サーバーでファイル自体を保護することは、ファイルが存在する特定のフォルダーへのアクセス許可を構成できるOSに依存します。

0
odez213

ファイルが完全に静的である場合は、読み取り専用またはWORMメディアを使用してデータファイルを保存するか、実際に「LiveCD」から完全なWebサーバーを実行できます。それは確かにすべての人のニーズに適しているわけではありませんが、データの整合性が最優先される限られたケースでは機能します。

0
Ausmith1