刚被网友问了一下说自己站图片被别人盗了,想加防盗链,故此,写了下Demo:
步骤很简单:
2:对请求来源和来源IP进行判断
3:分支返回图片
下面实战示例:
1:新建web站点项目:ImageLink
2:再建类库项目:ImageLinkClass
3:类库添加类:ImageLinkFilter
4:web站点添加到类库项目的引用
此时结果如下图:
上面多了一个文件夹Images和里面两张测试用的图片。
5: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文件如:
<add key="LocalIP" value="127.0.0.1"/>
</appSettings>
6:配置文件里添加对本类的引用
<!-- 省略其它 -->
<httpHandlers>
<add verb="*" path="*.jpg,*.jpeg" type="ImageLinkClass.ImageLinkFilter"/>
</httpHandlers>
</system.web>
7:按F5进行测试
测试1:通过本地页面Default.aspx测试图片
<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:直接访问图片路径,转身成功!
OK,本文打完收工!最后提供示例下载:点击下载
版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。 |
个人微信公众号![]() |
Donation(扫码支持作者):支付宝:![]() |
Donation(扫码支持作者):微信:![]() |
![]() |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)