zoukankan      html  css  js  c++  java
  • 小记图片防盗链

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

    步骤很简单:

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

     

    OK,本文打完收工!最后提供示例下载:点击下载

    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    JavaScript -- 条件语句和循环语句
    xpath的|
    Pythonic
    4k图片爬取+中文乱码
    xpath-房价爬取
    (.*?)实验室
    模块的循环导入
    bs4-爬取小说
    糗图-图片爬取
    re实战记录
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1809169.html
Copyright © 2011-2022 走看看