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

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

===============>>#1 票数:5

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

用户仍然可以直接键入脚本的URL以查看图像。 但您至少可以要求用户登录您的站点并被授权查看图像。

===============>>#2 票数:1

使用身份验证系统(如ASP .NET Membership)并需要某些凭据才能访问内容。 除此之外,真的没有办法。 如果用户具有直接链接并访问您网站的该区域,那么就Web服务器的工作方式而言,没有办法阻止它。

您可以采取某些安全措施来帮助阻止用户获得直接链接,但简单的一种方法是禁用右键单击。

===============>>#3 票数:0

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

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

如果浏览器确实已将某些内容下载到本地计算机,则绝对无法阻止该用户使用该数据(您可以设置一些障碍,例如避免右键单击等,但在某些情况下可以避免所有这些障碍方式或其他)。

===============>>#4 票数: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>

随意评论任何改进。

  ask by JEPAAB translate from so

未解决问题?本站智能推荐:

3回复

如果要在不直接访问数据库的DMZ中托管ASP.NET MVC Web应用程序,应如何设计其层(TCP端口1433被防火墙阻止)?

请考虑以下网络安全设置: 我已经在许多客户端上看到了上述网络设置。 IT基础结构团队不允许DMZ中的Web服务器通过端口1433建立与内部网络中托管的SQL Server的直接连接。具有讽刺意味的是,我已经看到web.config位于Web服务器上并带有纯文本DB密码,好的 通常
2回复

使用“ / Index”阻止访问路由

在.NET MVC路由中,有没有办法让我在显式键入索引操作时阻止对Index操作的访问,即我希望它返回404,就好像该操作无效一样? 我要实现: www.example.com / Index => 404错误代码 www.example.com =>“ Ro
5回复

拒绝直接URL访问操作方法

我正试图找到一种方法来拒绝任何直接访问我的动作方法。 基本上我希望我的用户点击链接进行导航,而不是直接在浏览器的地址栏中输入URL。 现在我知道这可以通过检查请求对象中的urlreferrer来完成,但这有点不可靠和弱,因为urlreferrer可以很容易地被修改,并且一些安全套件实际上
3回复

如何直接从Jquery访问.net MVC ViewData

我将viewdata传递到我的aspx页面,如下所示: 我正在使用用户名填充下拉列表,我想与Jquery绑定,以便当用户更改下拉列表时,这会依次更新当前所选用户的输入字段。 ASPX页面: 我连接Jquery以检测有效的下拉更改,但是如何使用数据操作输入框? 我做错
4回复

通过服务还是直接访问存储库?

是否是允许ASP.NET MVC控制器操作直接访问存储库(即使存在繁重的服务层,例如LoginService.Authorize())以检索,添加或更新数据的良好编码标准? 还是所有内容都应该通过服务,然后从那里到存储库?
1回复

如何直接从视图访问模型数据?

我只是ASP.NET MVC的初学者。 我知道我们可以通过使用TempData / ViewData / Viewbag或直接将其作为ActionResult传递给控制器​​,从而将模型的数据传递给View。 我想知道,有什么方法可以直接将Model类的成员访问到View?
3回复

如何阻止某些IP(用户)访问我的网站?

任何人都知道阻止某些用户(通过IP)访问您的网站(asp.net mvc上的网站)。 编辑:我知道网络服务器也可以做到这一点,但我需要在应用程序级别
1回复

阻止访问路由中不需要的默认URL

我的项目由所有具有默认索引动作的区域组成。 但是,此操作仅希望通过以下URL模式进行访问: 它的控制器是DefaultController ,操作名称是Index 。 现在,我似乎可以使用以下两个URL来访问此索引操作: /import/Default和/import/De
2回复

阻止访问mvc中的操作的最佳方法

在一个旧的mvc 1项目中,我正在为用户添加一个选项来编辑他们的详细信息。 我没有使用表单身份验证(主要是因为我不应该大规模更改以前的代码)所以我试图想到只允许当前登录的用户编辑他的详细信息的最佳方法。 目前,如果URL为http:// localhost:61681 / users /
2回复

ASP.NET MVC 4使页面无法直接访问

我有一个ASP.NET MVC 4博客90%完成但我需要一件事 - 我有一个网页让我们说索引/ secretPage但我希望能够导航到这个webPage只有在我从另一个重定向后 - 让我们说索引/重定向。 如果地址是硬编码的,则不应导航,如果访问者来自不同的链接,例如blog / post /