2013-04-16 182 views
3

使用ASP MVC 4.5,如何应用安全措施以防止用户直接访问内容?如何防止直接访问内容?

就像例如阻止通过输入链接访问存储在Web服务器上的图像或其他文件一样。

+0

你的意思[目录浏览](http://technet.microsoft.com/en-us/library/cc731109(V = ws.10)的.aspx)? – Silvermind

+0

你可以发布你正在使用什么Web服务器?只是一个建议,你的Web服务器已经不安全,因为每个人都可以通过使用图像链接访问它。 –

+0

我目前在当地工作。我需要通过输入链接来阻止用户访问图像。 – JEPAAB

回答

0

我已经产生,为了防止盗链以下的HttpHandler

它似乎在我的项目上工作,但我不肯定知道这是不是最好的做法。

public void ProcessRequest(HttpContext context) 
    { 
     //write your handler implementation here. 

     //Http 
     HttpRequest request = context.Request; 
     HttpResponse response = context.Response; 

     //Header - Properites 
     int Index = -1; 
     string[] Keys = request.Headers.AllKeys; 
     List<string[]> Values = new List<string[]>(); 

     //Header - Loop to get key values 
     for (int i = 0; i < Keys.Length; i++) 
     { 
      Values.Add(request.Headers.GetValues(i)); 
      //Check if property "Accept" exists 
      if (Keys[i].CompareTo("Accept") == 0) 
       Index = i; 
     } 

     //Check if URL and URL Referrer are null 
     if (context.Request.Url != null && context.Request.UrlReferrer != null && Index >= 0) 
     { 
      //Check image types 
      if (!context.Request.UrlReferrer.AbsolutePath.EndsWith(".bmp") || 
       !context.Request.UrlReferrer.AbsolutePath.EndsWith(".jpg") || 
       !context.Request.UrlReferrer.AbsolutePath.EndsWith(".jpeg") || 
       !context.Request.UrlReferrer.AbsolutePath.EndsWith(".png")) 
      { 

       //Check header "Accept" 
       if (Values[Index][0].CompareTo("*/*") == 0) 
       { 
        //Get bytes from file 
        byte[] MyBytes = File.ReadAllBytes(context.Request.PhysicalPath); 
        //new HttpContext(context.Request, context.Response).Request.MapPath(context.Request.RawUrl).ToString() 

        context.Response.OutputStream.Write(MyBytes, 0, MyBytes.Length); 

        context.Response.Flush(); 
       } 
       else 
        //Redirect     
        context.Response.Redirect("/Home"); 

      } 
      else 
       //Redirect     
       context.Response.Redirect("/Home"); 
     } 
     else 
      //Redirect     
      context.Response.Redirect("/Home"); 
    } 

另外,的Web.config修改如下:

<system.webServer> 
    <handlers> 
     <!--My--> 
     <add name="PhotoHandler-BMP" path="*.bmp" verb="GET" type="MVCWebApplication.Handlers.PhotoHandler" resourceType="File" /> 
     <add name="PhotoHandler-JPG" path="*.jpg" verb="GET" type="MVCWebApplication.Handlers.PhotoHandler" resourceType="File" /> 
     <add name="PhotoHandler-JPEG" path="*.jpeg" verb="GET" type="MVCWebApplication.Handlers.PhotoHandler" resourceType="File" /> 
     <add name="PhotoHandler-PNG" path="*.png" verb="GET" type="MVCWebApplication.Handlers.PhotoHandler" resourceType="File" /> 
    </handlers> 
</system.webServer> 

随意在任何改进意见。

+0

这是你自己问题的答案,还是这是一个新问题?如果这是一个新问题,请将其作为单独的帖子。 – mbeckish

+0

不过,我想就这个实现提供一些反馈。 – JEPAAB

+0

要获得关于您实施的最佳实践的意见,最好发布到[codereview.stackexchange.com](http://codereview.stackexchange.com) – mbeckish

1

使用的认证系统,如ASP .NET Membership,需要一定的凭据来访问内容。除此之外,真的没有办法。如果用户具有直接链接并访问您网站的该区域,则根据Web服务器的工作原理,无法阻止它。

有您可以采取有助于防止用户获得一个直接的联系,虽然,一个简单的人会被禁用右键单击某个安全措施。

+0

我正在研究有关HttpHandlers,RouteHandlers和Web.config的解决方案。如下所示: [HttpHandler] ) [Web.config](http://www.c-sharpcorner.com/forums/thread/136467/how-to-prevent-direct-access-to-files-and-folders-in-asp-net。 aspx) – JEPAAB

+0

您可以使用任何喜欢的路由,但路由仍将直接指向相关文件。如果用户具有该路线以及访问该位置,则他们将能够直接浏览它。你可以尝试和实现一些奇特的东西,比如身份验证和用户特定的文件被复制到一个临时的,唯一命名的位置,在一段时间后被删除;然而,这通常是针对下载服务器等非常具体的修复方式,它可能不适用于站点图像。 – Middas

0

除非您想要误导用户,否则您几乎无法做到。一种可能的(并且被广泛使用的)事情可能是检查你的引用者(并使其在应用程序中),但这很容易被欺骗。

如果对此的安全性至关重要,唯一需要考虑的是通过脚本下载所有内容以检查凭据(或者您可能需要的任何其他安全措施),但没有其他可以做的事情了。

如果浏览器确实已经下载了某些东西到本地机器上,那么绝对没有办法阻止该用户使用该数据(您可以设置一些障碍,如避免右键单击等,但所有这些都可以以某种方式避免)。

+0

我正在研究有关HttpHandlers,RouteHandlers和Web.config的解决方案。如下所示: [HttpHandler] ) [Web.config](http://www.c-sharpcorner.com/forums/thread/136467/how-to-prevent-direct-access-to-files-and-folders-in-asp-net。 aspx) – JEPAAB

5
  1. 将您在一个非web访问的文件夹图像。
  2. 创建可读取图像文件并在HTTP响应中返回其内容的服务器端脚本(例如HttpHandler)。
  3. 在该脚本中,执行用户验证以确保用户有权访问该文件。
  4. 在HTML中,将img标记的src属性指向您的脚本。

用户仍然可以直接输入脚本的URL来查看图像。但是您至少可以要求用户登录您的网站并有权查看图像。