小记图片防盗链,实现简单的图片防盗链介绍

2019-10-08 20:09 来源:未知

最近用到域的问题,不是同一主机的请求将不允许请求此页面。

在此,网站图片防盗链的方法是,通过获取Http请求头中的 Referer 标头与本网站域名比较,来判断用户是否来自本站跳转过来的 。

刚被网友问了一下说自己站图片被别人盗了,想加防盗链,故此,写了下Demo:

这其实和图片防盗链的本质是一样的。

创建一个全局处理程序,用来处理images目录下的图片的直接请求:

 

通过两个属性:由于当时用的aspx视图引擎,所以需要通过HttpContext.Current才能拿到httpcontext对象。

using System;
using System.Web;

步骤很简单:

通过Httpcontext.Current.Request.UrlReferrer属性,指的是:是谁来请求。

/// <summary>
///DaoLian 的摘要说明
/// </summary>
public class DaoLian:IHttpHandler
{
public bool IsReusable
{
get { return false; }
}

1:用IHttpHandler来处理图片请求
2:对请求来源和来源IP进行判断
3:分支返回图片

HttpContext.Current.Request.Url属性,指的是:谁被请求。

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/jpeg";
//
//当前请求 的地址
Uri url = context.Request.Url;
Uri urlReferrer = context.Request.UrlReferrer;
if (urlReferrer != null)
{
//判断域名和端口号是否相等
if (IsSameDomain(url,urlReferrer))
{
//获取当前请求的图片的绝对路径
string path = context.Request.MapPath(context.Request.RawUrl);
context.Response.WriteFile(path);
}
else
{
//盗链图片的地址
string path = context.Request.MapPath("../daolian.jpg");
context.Response.WriteFile(path);
}
}
else
{
//盗链图片的地址
string path = context.Request.MapPath("../daolian.jpg");
context.Response.WriteFile(path);
}
}
//判断域名和端口号是否相等
bool IsSameDomain(Uri url1,Uri url2)
{
return Uri.Compare(url1, url2, UriComponents.HostAndPort, UriFormat.Unescaped, StringComparison.CurrentCultureIgnoreCase) == 0;
}
}

 

如果这两个URI的主机名和端口号一直,则表示来自同一主机。

 

            //获取有关客户端上次请求的URL信息,该请求链接到当前的URL
            //表示是谁去请求
            string urlReferrer = HttpContext.Current.Request.UrlReferrer.Host.ToString();
            //获取有关当前请求的URL
            //表示请求谁
            string url = HttpContext.Current.Request.Url.Host.ToString();
            Uri.Compare(HttpContext.Current.Request.UrlReferrer, HttpContext.Current.Request.Url, UriComponents.HostAndPort, UriFormat.SafeUnescaped, StringComparison.CurrentCultureIgnoreCase);

 

  

下面实战示例:

 

1:新建web站点项目:ImageLink

关于图片防盗链实现的方案:

2:再建类库项目:ImageLinkClass

在项目中,图片的src不要直接写,可以通过一个方法去请求,在后台接受这个请求,

3:类库添加类:ImageLinkFilter

在做一样的判断,如果主机一样则返回正确的图片地址,如果不是则做相应的处理。

4:web站点添加到类库项目的引用

下面是官网的信息:

 

Return Value

Type: System.Int32

An Int32 value that indicates the lexical relationship between the compared Uri components.

Value

Meaning

Less than zero

uri1 is less than uri2.

Zero

uri1 equals uri2.

Greater than zero

uri1 is greater than uri2.

 

追加:

Uri.Compare的返回值为int类型,

0:表示两个相等。

大于0:表示前者大于后者。

小于0:表示前者小于后者。

 

此时结果如下图:

图片 1

 

上面多了一个文件夹Images和里面两张测试用的图片。

 

5:ImageLinkFilter类继承IHttpHandler接口,并实现接口,代码如下

图片 2图片 3

    public class ImageLinkFilter:IHttpHandler
    {
        #region IHttpHandler 成员

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }

        public void ProcessRequest(HttpContext context)
        {
            Uri u = context.Request.UrlReferrer;//访问来源地址
            string ip = context.Request.UserHostAddress;//访问来源IP
            string serverHost = context.Request.Url.Host;//当前访问主机地址
            
            string localIP=System.Configuration.ConfigurationManager.AppSettings["LocalIP"];
            if (u == null || u.Host.ToLower() != serverHost.ToLower() || ip != localIP)
            {
                context.Response.WriteFile("~/Images/passby.jpg");
            }
            else
            {
                context.Response.WriteFile(context.Request.PhysicalPath);
            }
        }

        #endregion
    }

 

代码很简洁了,本地IP写在web.config文件如:

TAG标签:
版权声明:本文由金沙澳门官网4166发布于文物考古,转载请注明出处:小记图片防盗链,实现简单的图片防盗链介绍