Domanda

Qualcuno conosce una buona pratica per proteggere i media per asp.net?

Devo ospitare una varietà di media che richiedono l'autorizzazione per visualizzare una specifica immagine / video. vale a dire che un utente specifico può avere o meno l'autorizzazione a visualizzare un file multimediale e questo fatto può essere modificato al volo.

Non mi interessa se sono in grado di scaricare un file multimediale a cui hanno accesso, ma non voglio nemmeno che siano a conoscenza di elementi a cui non dovrebbero avere accesso.

Ho già preso in considerazione l'offuscamento dell'url - questo mi sembra abbastanza zoppo.

Ho un utente autenticato (e non sono disposto a cambiarlo).

Vorrei mantenere la struttura delle cartelle dei file multimediali non correlata alle autorizzazioni.

È stato utile?

Soluzione

Crea un HttpHandler a cui è necessario accedere a tutti i media. Quindi, prima di recuperare il file e inviarlo all'utente, è possibile eseguire tutte le convalide desiderate. Tieni tutti i tuoi file multimediali al di fuori del percorso principale di wwwroot o nega l'accesso a quella cartella utilizzando le autorizzazioni.

Maggiori informazioni su questo argomento qui:

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

Altri suggerimenti

Uso un file XML come questo per impostare quali utenti / gruppi hanno accesso a un file

<?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>

i file sono archiviati sopra la radice http, quindi non sono accessibili tramite URL.

Quando un utente tenta di accedere a GetFile.aspx? file = file.doc carico l'XML, ottieni la riga con

XmlNode xnFile= XML.GetElementById(wantedFile);

, quindi chiamo una funzione

 HasAccess(Context.User, xnFile); 

Che verifica se l'utente ha effettuato l'accesso e confronta le autorizzazioni, e se è ok per questo utente avere il file, leggo i file dal disco e li scrivo con

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();

In realtà ora ho più di mille file e penso di scrivere i dati dei file nel database poiché l'XML è stato danneggiato due volte in 5 anni, probabilmente a causa di arresti anomali o uso simultaneo.

Dal tuo commento nella risposta Spikolynn

  

Sono perplesso: in che modo differisce dall'offuscamento? Un utente autenticato sarebbe in grado di condividere un'immagine (per la quale è autorizzato) con un altro utente autenticato ma non autorizzato?

Suppongo che tu provi a impedire condivisione non autorizzata dei media .

Questo è qualcosa che molte aziende (Microsoft, Apple, IBM, ecc.) hanno investito molto denaro per risolvere. La soluzione era DRM e ora la stanno rimuovendo, perché non è riuscita .

Quindi, la mia risposta è che non puoi impedire la condivisione se l'utente è disposto a fare qualche sforzo per evitarlo.

Puoi semplicemente mantenere oneste le persone oneste applicando alcune tecniche come Spikolynn o Lusid spiegano nelle loro risposte.

Suggerirei una tabella contenente i file a cui ogni utente ha accesso:

UserID int
FileID varchar

quindi una tabella per i tuoi file:

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

Sul disco rigido, denominare il file FileID (UniqueIdentifier) ??e FileType (l'estensione, ad esempio .jpg). Il fileID nella tabella delle autorizzazioni conterrà UniqueIdentifier generato nell'altra tabella.

Puoi passare questo tramite l'URL sapendo con relativa sicurezza che l'utente non sarà in grado di indovinare il nome di qualsiasi altro file.

Aggiornamento: tra l'altro molto è più semplice che scrivere un HttpHandler o gestire i permessi sui file. Tuttavia, mentre le probabilità che qualcuno indovini un altro nome di file sono infinitesime, non si tratta di una sicurezza ermetica in quanto un utente può concedere a un altro accesso al file.

brownpaperpackage.aspx? Id = {GUID}

Nell'evento Load di media.aspx, si verifica che l'utente sia autenticato, quindi si verifica che l'utente abbia il diritto di visualizzare i media e, in tal caso, caricare i media come stream e inviarli alla risposta della pagina come Spikolynn dimostrato.

Perché farlo in questo modo? È semplice da codificare e ottieni tutti i vantaggi dei servizi di autenticazione ASP.NET e IIS, dai quali puoi trovare l'utente che richiede il supporto. È banale mappare quell'utente a un elenco di accesso per i tuoi oggetti multimediali. E la Pagina ha l'oggetto richiesta proprio lì. Stai anche nascondendo il nome dei media, quindi non puoi dire cosa sta succedendo dall'URL.

Come si impedisce alle persone di accedere direttamente ai propri media? I file multimediali non possono essere archiviati nella directory virtuale IIS. Se lo sono, c'è la possibilità che possano essere scaricati direttamente. È possibile archiviarli in un database come array di byte (BLOB) o archiviarli su disco all'esterno della directory virtuale Web. Gli utenti devono passare attraverso ASP.NET per accedere ai file

Come tenere traccia di quali utenti hanno accesso a quali media? Tieni traccia dei tuoi utenti attraverso l'appartenenza ad asp.net. Ciò significa che ogni utente ha un ID nella tabella aspnet_users. Creare una tabella per il supporto con un ID e un nome file (o un BLOB contenente il supporto effettivo). Quindi devi solo creare una terza tabella che collega i due. Questa tabella conterrebbe un ID utente e un ID supporto, a significare che questo utente può visualizzare questo supporto. Con l'id utente (dall'appartenenza ad asp.net) e l'id multimediale (dall'URL) devi solo

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

e se il conteggio > 0 l'utente può visualizzare il file multimediale.

Un esempio di come useresti l'URL:

<asp:image 
  runat="server" 
  ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top