Question

Est-ce que quelqu'un connaît une bonne pratique de sécurisation des médias pour asp.net?

Je dois héberger divers supports nécessitant l'autorisation d'afficher une image / une vidéo spécifique. c'est-à-dire qu'un utilisateur spécifique peut ou non avoir l'autorisation de visualiser un fichier multimédia - et ce fait peut être changé à la volée.

Peu m'importe s'ils peuvent télécharger un fichier multimédia auquel ils ont accès. Je ne veux simplement pas qu'ils soient au courant des éléments auxquels ils ne devraient pas avoir accès.

J'ai déjà envisagé l'obscurcissement de l'URL - cela me semble assez boiteux.

J'ai des utilisateurs authentifiés (et je ne suis pas disposé à changer cela).

Je souhaite que la structure des dossiers de fichiers multimédias ne soit pas liée aux autorisations.

Était-ce utile?

La solution

Construisez un HttpHandler auquel tous les médias doivent être accessibles. Ensuite, avant de récupérer le fichier et de l'envoyer à l'utilisateur, vous pouvez effectuer les validations souhaitées. Conservez tous vos médias en dehors du chemin wwwroot principal ou refusez l'accès à ce dossier à l'aide d'autorisations.

Plus d'informations sur ce sujet ici:

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

Autres conseils

J'utilise un fichier XML comme celui-ci pour définir quels utilisateurs / groupes ont accès à un fichier

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

sont stockés au-dessus de la racine http, ils ne sont donc pas accessibles par URL.

Lorsqu'un utilisateur tente d'accéder à GetFile.aspx? file = fichier.doc Je charge le fichier XML, la ligne est affichée avec

XmlNode xnFile= XML.GetElementById(wantedFile);

, j'appelle une fonction

 HasAccess(Context.User, xnFile); 

Qui vérifie si l'utilisateur est connecté et compare les autorisations, et s'il est correct que cet utilisateur ait le fichier, je lis les fichiers sur le disque et les écris avec

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

En fait, j’ai maintenant plus d’un millier de fichiers et je pense écrire ces données dans la base de données car le code XML a été corrompu deux fois en cinq ans, probablement à cause de plantages ou d’une utilisation simultanée.

D'après votre commentaire dans la réponse de Spikolynn

  

Je suis perplexe - en quoi cela diffère-t-il de l'obfuscation? Un utilisateur authentifié pourrait-il partager une image (pour laquelle il est autorisé) avec un autre utilisateur authentifié mais non autorisé?

Je suppose que vous essayez d'empêcher le partage non autorisé de contenu multimédia .

C’est quelque chose que beaucoup d’entreprises (Microsoft, Apple, IBM, etc.) ont mis beaucoup d’argent à résoudre. La solution était la gestion des droits numériques et maintenant, elle est en train de la supprimer, car l'opération a échoué .

Donc, ma réponse est que vous ne pouvez pas empêcher le partage si l'utilisateur est prêt à faire des efforts pour l'éviter.

Vous pouvez simplement garder les honnêtes gens honnêtes en appliquant certaines techniques, comme l'expliquent Spikolynn ou Lusid dans leurs réponses.

Je suggérerais une table contenant les fichiers auxquels chaque utilisateur a accès:

UserID int
FileID varchar

puis un tableau pour vos fichiers:

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

Sur le disque dur, nommez le fichier FileID (UniqueIdentifier) ??et FileType (l’extension, par exemple .jpg). L'identifiant de fichier dans la table des autorisations contiendra l'identificateur unique UniqueIdentifier généré dans l'autre table.

Vous pouvez le transmettre via l'URL en sachant avec une relative sécurité que l'utilisateur ne pourra pas deviner le nom d'un autre fichier.

Mise à jour: c'est d'ailleurs beaucoup plus simple que d'écrire un HttpHandler ou de traiter des autorisations de fichiers. Cependant, bien que les chances que quelqu'un découvre un autre nom de fichier soient infinitésimales, la sécurité n'est pas hermétique, car un utilisateur peut en donner l'accès à un autre.

brownpaperpackage.aspx? id = {guid}

Dans l'événement Load de media.aspx, vous vérifiez que l'utilisateur est authentifié, puis que l'utilisateur a le droit de consulter le média. S'il le fait, chargez le média en tant que flux et envoyez-le à la réponse de la page. comme démontré par Spikolynn .

Pourquoi le faire de cette façon? C'est simple à coder et vous bénéficiez de tous les avantages des services d'authentification ASP.NET et IIS, à partir desquels vous pouvez trouver l'utilisateur qui demande le support. Son simple pour mapper cet utilisateur à une liste d'accès pour vos objets multimédias. Et la page a l'objet de requête juste là. Vous cachez également le nom du média afin que vous ne puissiez pas savoir ce qui se passe à partir de l'URL.

Comment empêchez-vous les gens d'accéder directement à vos médias? Vos fichiers multimédia ne peuvent pas être stockés dans le répertoire virtuel IIS. S'ils le sont, il est possible qu'ils puissent être téléchargés directement. Vous pouvez les stocker dans une base de données sous forme de tableau d'octets (blob) ou sur un disque en dehors du répertoire virtuel Web. Les utilisateurs doivent passer par ASP.NET pour accéder aux fichiers

Comment garder la trace de ce que les utilisateurs ont accès à quel média? Vous gardez une trace de vos utilisateurs grâce à votre abonnement asp.net. Cela signifie que chaque utilisateur a un identifiant dans la table aspnet_users. Créez une table pour votre média avec un identifiant et un nom de fichier (ou un blob contenant le média réel). Ensuite, il vous suffit de créer une troisième table qui relie les deux. Cette table contient un identifiant d'utilisateur et un identifiant de média, ce qui signifie que cet utilisateur peut voir ce média. Avec l’identifiant de l’utilisateur (à partir de l’adhésion asp.net) et l’ID du média (à partir de l’URL), il vous suffit de

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

et si le nombre > 0 l'utilisateur peut voir le média.

Voici un exemple d'utilisation de l'URL:

<asp:image 
  runat="server" 
  ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top