分享

图片防盗链的

 XXG学习园 2012-06-17

步骤很简单:

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

 

 

 

下面实战示例:

1:新建web站点项目:ImageLink

2:再建类库项目:ImageLinkClass

3:类库添加类:ImageLinkFilter

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

 

此时结果如下图:

 

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

 

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

复制代码
    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文件如:

<appSettings>
     
<add key="LocalIP" value="127.0.0.1"/>
</appSettings>

 

 

6:配置文件里添加对本类的引用

<system.web>
<!--  省略其它  -->
   
<httpHandlers>
      
<add verb="*" path="*.jpg,*.jpeg" type="ImageLinkClass.ImageLinkFilter"/>
   
</httpHandlers>
</system.web>

 

 

7:按F5进行测试

测试1:通过本地页面Default.aspx测试图片

<form id="form1" runat="server">
    
<img src="Images/chess.jpg" />
</form>

得出结果正常访问图片结果:

原因:因为来源页不为Null,地址也对,同时IP也一样。

你可以改一下IP,看看结果。

 

测试2:直接访问图片地址

得出结果是:

原因:直接访问图片时,来源页是Null,所以被转向了。

 

按理,以上却是OK了,然而部署到IIS时,一切效果都消失了。

 

8:IIS部署

我们修改一下项目属性页的配置:服务器选项,用本机IIS来调试:修改如下图:

 

接着F5调试,我们发现ImageLinkFilter内的断点无效,图片也被正常访问

 

其实,这里需要添加一下对IIS的映射,让aspnet_isapi.dll能处理下图片类型:

 

9:添加IIS映射

A:IIS-》网站属性—》主目录-》配置

 

 

 

B:在映射-》点添加[可添加多个]

可执行文件路径为:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll

扩展名这里注意了:.jpg [我一直打成*.jpg,结果那个确定按钮一直不可用]

 

 

10:最终测试

加完映射之后,我们再F5运行,发现断点执行了,测试效果如下:

结果1:通过页面访问,转向成功!

 

 

结果2:直接访问图片路径,转身成功!

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多