博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片防盗链
阅读量:5906 次
发布时间:2019-06-19

本文共 1839 字,大约阅读时间需要 6 分钟。

步骤很简单:

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:直接访问图片路径,转身成功!

转载于:https://www.cnblogs.com/xiexingen/archive/2013/01/07/2850145.html

你可能感兴趣的文章
go语言time包的学习(Time,Location,Duration,Timer,Ticker)
查看>>
拓扑排序((算法竞赛入门经典)刘汝佳)
查看>>
#leetcode#One Edit Distance
查看>>
Deep Learning Toolboxs
查看>>
Java多线程之~~~线程安全容器的非堵塞容器
查看>>
004_on-my-zsh漂亮的shell
查看>>
委托(5)委托和事件
查看>>
《为什么我们的决策总出错》摘录
查看>>
罗辑思维现象透析
查看>>
14、Java并发性和多线程-Java ThreadLocal
查看>>
SharePoint创建Alternate Access Mapping (AAM)备用訪问映射
查看>>
OAthe2 Login use OkHttpClient and OAuth2RestTemplate
查看>>
链接与加载过程中,几个关键的概念
查看>>
clamp 函数
查看>>
Linux下永久改动MAC地址和ifconfig命令总结
查看>>
一点一点学架构(四)—Spring.NET错误Cannot Resolve Type……
查看>>
线段树基础
查看>>
Maven传递依赖的时候,同名包不同版本号的包均会下载,可是编译的时候,仅仅会载入一个高版本号的。...
查看>>
Qt的Socket数据通讯的一个样例。
查看>>
hdu5396 Expression 区间dp +排列组合
查看>>