现在探讨一下网站图片防盗链
一步一步的进行。
(一) 一个网页中对同域的图片的访问
[准备]在Vs中添加一网站,添加images图片文件夹,里边放一张a1.gif的图片,一张用于显示防盗链的图片z1.gif
(1) Aspx
<form id="form1" runat="server">
<div>
<img src="images/a1.gif" />
</div>
</form>
(2)在浏览器中访问
有2个访问请求(只取2个属性来分析):
<1>请求Default.aspx
·(Request-Line):GET /Default.aspx HTTP/1.1
·Host:192.168.1.105:8029
<2>请求图片
·(Request-Line):GET /images/a1.gif HTTP/1.1
·Host:192.168.1.105:8029
·Referer: http://192.168.1.105:8029/Default.aspx
第一次请求的时候没有Referer属性值(或说为null)。第二次请求是访问资源文件,这时,Referer就包含了一个对资源文件的容器的地址,即图片a1.gif来自于http://192.168.1.105:8029/Default.aspx 。
注:http标准协议中有专门的字段记录referer:一来可以追溯上一个入站地址是什么;二来对于资源文件,可以跟踪到包含显示他的网页地址是什么
(二)另一网站对图片的跨域链接
把上一个网站在IIS中发布,然后在Vs中新建立网站。网站中在Test.aspx中添加图片
(1)aspx文件
<form id="form1" runat="server">
<div>
<img src="http://192.168.1.105:8029/images/a1.gif" />
</div>
</form>
(2)在浏览器中访问
有2个请求
<1>请求Test.aspx
·(Request-Line): GET /web2/Test.aspx HTTP/1.1
·Host:localhost:20372
<2>请求图片资源
·(Request-Line):GET /images/a1.gif HTTP/1.1
·Host:192.168.1.105:8029
·Referer:http://localhost:20372/web2/Test.aspx
在第一次请求时,此时要向localhost请求Test.aspx。在第二次请求中,请求资源文件a1.gif,这时要访问的主机地址为:192.168.1.105:8029,这个就是在IIS中发布的图片的源服务器。而Referer还是Test.aspx所在的网站的请求地址。也就是图片a1.gif的的包含容器。这两个地址不同了,可以利用这个特征来防止图片的盗链:如果资源文件的(直接)包含地址与源地址相同则可以使用图片,否则就是盗链。
(三)添加图片过滤img.ashx文件
context.Response.ContentType = "image/jpg";
if (context.Request.UrlReferrer != null &&
context.Request.UrlReferrer.Host.Equals(context.Request.Url.Host,
StringComparison.InvariantCultureIgnoreCase))
context.Response.WriteFile(context.Server.MapPath("~/images/" +
context.Request.QueryString["img"]));
else
context.Response.WriteFile(context.Server.MapPath("~/images/z1.gif"));
ContentType设置为图片。判断当请求的(图片)资源的源地址(Host)与直接引用地址(Referere)相同,才可以返回请求的图片,否则把图片引用指向自定义的防盗图片。此时的图片引用要改成:
<img src="Img.ashx?img=a1.gif" />
(四)通过加防盗的同域资源访问
(1)default.aspx文件
图片引用改为:<img src="Img.ashx?img=a1.gif" />
(2)在浏览器中浏览
两个请求
<1>请求default.aspx
·(Request-Line):GET /Default.aspx HTTP/1.1
·Host:192.168.1.105:8029
<2>请求图片资源
·(Request-Line):GET /Img.ashx?img=a1.gif HTTP/1.1
·Host:192.168.1.105:8029
·Referer:http://192.168.1.105:8029/Default.aspx
第二次请求中,host与referer的Host部分相同,则返回正常的图片
(五)异域访问
(1)在网站2中,添加对图片的访问
<form id="form1" runat="server">
<div>
<img src="http://192.168.1.105:8029/Img.ashx?img=a1.gif" />
</div>
</form>
(2)在浏览器中访问
<1>请求Test.aspx
·(Request-Line):GET /web2/Test.aspx HTTP/1.1
·Host:localhost:20372
<2>请求资源文件
·(Request-Line):GET /Img.ashx?img=a1.gif HTTP/1.1
·Host:192.168.1.105:8029
·Referer:http://localhost:20372/web2/Test.aspx
请求资源文件时,资源文件地址:Host,直接包含地址,referer,host与referer的host地址不同,所以得到的图片地址是一个防盗的图片地址。
(未完……)
注:
http头里的两个属性
Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号
Referer:浏览器向 WEB 服务器表明自己是从哪个网页/URL 获得/点击 当前请求中的网址/URL。