使用 ASP MVC 4.5,如何应用安全措施来防止用户直接访问内容?
例如,仅通过输入链接来防止访问存储在 Web 服务器上的图像或其他文件。
src
属性img
指向您的脚本。用户仍然可以直接输入脚本的 URL 来查看图像。但是您至少可以要求用户登录到您的站点并有权查看图像。
使用ASP .NET Membership等身份验证系统并要求某些凭据才能访问内容。除此之外,真的没有办法了。如果用户有直接链接并可以访问您网站的该区域,则根据网络服务器的工作方式,没有办法阻止它。
您可以采取某些安全措施来帮助防止用户获得直接链接,一个简单的方法就是禁用右键单击。
为了防止盗链,我制作了以下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>
随时评论任何改进。
除非您想打扰您的用户,否则您无能为力。一种可能(并且被广泛使用)的事情可能是检查您的推荐人(并使其出现在您的应用程序中),但这很容易被欺骗。
如果对此的安全性至关重要,那么唯一想到的就是通过脚本下载所有内容,该脚本将检查凭据(或您可能想要的任何其他安全措施),但您无能为力。
如果浏览器确实已经将某些内容下载到本地计算机,那么您绝对无法阻止该用户使用该数据(您可以设置一些障碍,例如避免右键单击等,但在某些情况下可以避免所有这些障碍)方式或其他)。