6

誰かがasp.netのメディアを保護するための良い習慣を知っていますか?

特定の画像/ビデオを表示するための許可が必要なさまざまなメディアをホストする必要があります。つまり、特定のユーザーがメディアファイルを表示する権限を持っている場合と持っていない場合があります。この事実は、その場で変更される可能性があります。

アクセスできるメディアファイルをダウンロードできるかどうかは関係ありません。アクセスしてはいけないアイテムに気づいてほしくないだけです。

私はすでにURLの難読化を検討しました-これは私にはかなり足りないようです。

私はフォーム認証されたユーザーを持っています(そして私はこれを変更するつもりはありません)。

メディアファイルのフォルダ構造を権限とは無関係に保ちたいのですが。

4

5 に答える 5

11

すべてのメディアにアクセスする必要があるHttpHandlerを作成します。次に、ファイルを取得してユーザーに送信する前に、必要な検証を実行できます。すべてのメディアをメインのwwwrootパスの外に置くか、アクセス許可を使用してそのフォルダーへのアクセスを拒否します。

このトピックの詳細については、こちらをご覧ください。

http://www.15seconds.com/Issue/020417.htm

于 2009-01-21T19:02:07.660 に答える
2

このようなxmlファイルを使用して、ファイルにアクセスできるユーザー/グループを設定します

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
    <!ELEMENT file ANY>
    <!ATTLIST file name ID #REQUIRED>
]>
<root>
    <file name="file.doc" users="155,321" groups="grp5" />
    <file name="file2.doc" users="321" groups="" />
</root>

ファイルは http ルートの上に保存されるため、URL からアクセスすることはできません。

ユーザーが GetFile.aspx?file=file.doc にアクセスしようとすると、XML を読み込み、次の行を取得します

XmlNode xnFile= XML.GetElementById(wantedFile);

、次に関数を呼び出します

 HasAccess(Context.User, xnFile); 

ユーザーがログインしているかどうかを確認し、アクセス許可を比較します。このユーザーがファイルを持っていても問題ない場合は、ディスクからファイルを読み取り、

FileInfo thisFile = new FileInfo(secretLocation + wantedFile);
Response.Clear();
Response.Buffer = false;
Response.BufferOutput = false;
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Length", thisFile.Length.ToString());
Response.AddHeader("Content-disposition", "filename=" + thisFile.Name);
Response.ContentType = "application/none";
Response.WriteFile(secretLocation + wantedFile);
Response.Close();
Response.End();
Response.ClearContent();
Response.ClearHeaders();

実際、現在私は 1,000 を超えるファイルを所有しており、おそらくクラッシュまたは同時使用が原因で、XML が 5 年間で 2 回破損したため、ファイル データをデータベースに書き込むことを考えています。

于 2009-01-27T17:28:03.233 に答える
1

Spikolynnの回答のコメントから

私は困惑しています - これは難読化とどう違うのですか? 認証されたユーザーは、認証されているが許可されていない別のユーザーと (許可されている) イメージを共有できますか?

メディアの無許可の共有を防止しようとしていると思います。

これは、多くの企業 (Microsoft、Apple、IBM など) が解決するためにかなりの金額を投入してきたものです。解決策は DRMでしたが、失敗したため、現在は削除されています。

したがって、私の答えは、ユーザーが共有を避けるために何らかの努力をしても構わないと思っている場合、共有を防ぐことはできないということです。

SpikolynnLusidが回答で説明しているように、いくつかのテクニックを適用することで、正直な人々を正直に保つことができます。

于 2009-01-28T19:50:29.437 に答える
0

各ユーザーがアクセスできるファイルを保持するテーブルをお勧めします。

UserID int
FileID varchar

次に、ファイルのテーブル:

FileID    UniqueIdentifier
FileType  char(4)  <- so you know which extension to use.
etc...

ハードドライブで、ファイルにFileID(UniqueIdentifier)とFileType(拡張子、たとえば.jpg)という名前を付けます。パーミッションテーブルのfileIDは、他のテーブルで生成されたUniqueIdentifierを保持します。

ユーザーが他のファイルの名前を推測できないことを比較的安全に知っているURLを介してこれを渡すことができます。

更新:ちなみに、これはHttpHandlerを記述したり、ファイルのアクセス許可を処理したりするよりもはるかに簡単です。ただし、誰かが別のファイル名を推測する可能性はごくわずかですが、あるユーザーが別のユーザーにファイルへのアクセスを許可する可能性があるため、完全なセキュリティではありません。

于 2009-01-21T19:06:13.017 に答える
0

brownpaperpackage.aspx?id={guid}

media.aspx の Load イベントで、ユーザーが認証されていることを確認し、ユーザーがメディアを表示する権利を持っていることを確認します。もしそうなら、メディアをストリームとしてロードし、Spikolynnが示したようにページの Response にフィードします。 .

なぜこのようにするのですか?コーディングが簡単で、ASP.NET および IIS の認証サービスのすべての利点が得られ、そこからメディアを要求しているユーザーを見つけることができます。そのユーザーをメディア オブジェクトのアクセス リストにマップするのは簡単です。そして、ページにはリクエストオブジェクトがあります。メディアの名前も隠しているため、URL から何が起こっているのかわかりません。

人々があなたのメディアに直接アクセスするのをどのように防いでいますか? メディア ファイルを IIS 仮想ディレクトリに保存できません。そうであれば、直接ダウンロードできる可能性があります。それらをバイト配列 (blob) としてデータベースに格納するか、Web 仮想ディレクトリの外部のディスクに格納できます。ファイルにアクセスするには、ユーザーは ASP.NET を経由する必要があります。

どのユーザーがどのメディアにアクセスできるかをどのように追跡しますか? asp.net メンバーシップを通じてユーザーを追跡します。つまり、各ユーザーは aspnet_users テーブルに ID を持っています。ID とファイル名 (または実際のメディアを含む blob) を使用して、メディアのテーブルを作成します。次に、2 つを接続する 3 番目のテーブルを作成する必要があります。このテーブルには、ユーザー ID とメディア ID が含まれ、このユーザーがこのメディアを表示できることを示します。ユーザー ID (asp.net メンバーシップから) とメディア ID (URL から) を使用して、次のことを行う必要があります。

select count(*) from UserMedia where UserId = @UserGuid and MediaId = @MediaIdFromUrl

カウント > 0 の場合、ユーザーはメディアを表示できます。

URL の使用例:

<asp:image 
  runat="server" 
  ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />
于 2009-01-28T19:11:11.013 に答える