4

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

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

4

4 回答 4

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

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

于 2013-04-16T17:48:32.690 回答
1

使用ASP .NET Membership等身份验证系统并要求某些凭据才能访问内容。除此之外,真的没有办法了。如果用户有直接链接并可以访问您网站的该区域,则根据网络服务器的工作方式,没有办法阻止它。

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

于 2013-04-16T17:18:22.847 回答
1

为了防止盗链,我制作了以下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>

随时评论任何改进。

于 2013-04-17T15:04:42.397 回答
0

除非您想打扰您的用户,否则您无能为力。一种可能(并且被广泛使用)的事情可能是检查您的推荐人(并使其出现在您的应用程序中),但这很容易被欺骗。

如果对此的安全性至关重要,那么唯一想到的就是通过脚本下载所有内容,该脚本将检查凭据(或您可能想要的任何其他安全措施),但您无能为力。

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

于 2013-04-16T17:28:08.097 回答