代码之家  ›  专栏  ›  技术社区  ›  mson

asp.net媒体保护

  •  6
  • mson  · 技术社区  · 17 年前

    有人知道为asp.net保护媒体的良好做法吗?

    我需要托管各种需要许可才能观看特定图像/视频的媒体。即,特定用户可能有也可能没有查看媒体文件的权限,并且这一事实可能会随时改变。

    我不在乎他们是否可以下载他们可以访问的媒体文件,我只是不想让他们知道他们不应该访问的项目。

    我已经考虑过url混淆——这对我来说似乎很蹩脚。

    我有经过表单身份验证的用户(我不愿意更改此设置)。

    我想保持媒体文件夹结构与权限无关。

    5 回复  |  直到 17 年前
        1
  •  11
  •   Lusid    17 年前

    构建一个所有媒体都必须通过的HttpHandler。然后,在检索文件并将其发送给用户之前,您可以执行任何您想要的验证。将所有媒体放在wwwroot主路径之外,或使用权限拒绝访问该文件夹。

    有关此主题的更多信息,请点击此处:

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

        2
  •  2
  •   Spikolynn Ankit    17 年前

    我使用这样的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();
    

    实际上,现在我有1000多个文件,我想将文件数据写入数据库,因为XML在5年内损坏了两次,可能是由于崩溃或同时使用。

        3
  •  1
  •   Eduardo Molteni    17 年前

    根据您在Spikolyn回复中的评论

    我很困惑——这和混淆有什么不同?经过身份验证的用户能否与另一个经过身份验证但未经授权的用户共享图像(他们有权访问)?

    我猜你试着 防止未经授权 共享 媒体 .

    这是许多公司(微软、苹果、IBM等)投入大量资金解决的问题。 解决方案是DRM ,现在他们正在删除它,因为 它失败了 .

    所以,我的答案是你 无法阻止共享 如果用户愿意付出一些努力来避免它。

    你可以 让诚实的人保持诚实 通过应用一些技术,如 Spikolyn Lusid 在他们的回答中解释。

        4
  •  0
  •   Mark Brittingham    17 年前

    我建议使用一个表来保存每个用户都可以访问的文件:

    UserID int
    FileID varchar
    

    然后是一个文件表:

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

    在硬盘上,将文件命名为FileID(唯一标识符)和FileType(扩展名,例如.jpg)。权限表中的fileID将保存在另一个表中生成的唯一标识符。

    您可以通过URL传递此信息,相对安全地知道用户将无法猜测任何其他文件的名称。

    更新:顺便说一句, 比编写HttpHandler或处理文件权限更简单。然而,尽管有人猜测另一个文件名的可能性微乎其微,但这并不是严密的安全措施,因为一个用户可能会给另一个用户一个访问该文件的权限。

        5
  •  0
  •   Community Mohan Dere    9 年前

    牛皮纸包装.aspx?id={guid}

    在media.aspx的Load事件中,您验证用户是否经过身份验证,然后验证用户是否有权查看媒体,如果有,则将媒体作为流加载并将其作为 Spikolynn 论证。

    为什么这样做?代码编写简单,您可以获得ASP的所有好处。NET和IIS的身份验证服务,您可以从中找到请求媒体的用户。将该用户映射到媒体对象的访问列表很简单。页面的请求对象就在那里。你还隐藏了媒体的名称,所以你无法从网址上知道发生了什么。

    你如何阻止人们直接访问你的媒体?您的媒体文件无法存储在IIS虚拟目录中。如果是,则有可能直接下载。您可以将它们作为字节数组(blob)存储在数据库中,也可以将它们存储在web虚拟目录之外的磁盘上。用户必须通过ASP。NET访问文件

    你如何跟踪哪些用户可以访问哪些媒体?您通过asp.net会员资格跟踪您的用户。这意味着每个用户在aspnet_users表中都有一个ID。使用id和文件名(或包含实际媒体的blob)为您的媒体创建一个表。然后,您只需要创建第三个表来连接这两个表。此表将包含用户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" />
    
    推荐文章