首页 > 开发 > 综合 > 正文

实例代码:图片、文件防盗链程序

2024-07-21 02:28:13
字体:
来源:转载
供稿:网友

  关于图片盗链这个问题,毕竟是自己的劳动成功,很多人不希望别人就那么轻易地偷走了。 这个功能在很多的论坛上都具有,可能是因为盗链的行为太多了吧

  反盗链的程序其实很简单,熟悉asp.net 应用程序生命周期的话很容易就可以写一个,运用httpmodule在beginrequest事件中拦截请求就ok了,剩下的工作就是过滤,再过滤!

  如果不熟悉httpmodule的话,可以去msdn上查阅,介绍非常详细,地址:ms-help://ms.vscc.v80/ms.msdn.v80/ms.visualstudio.v80.chs/dv_aspnetcon/html/f1d2910f-61d0-4541-8af8-c3c108ca351f.htm。这里就不废话了

 1private void application_beginrequest(object source, eventargs e)
 2{
 3    httpapplication application = (httpapplication)source;
 4    httpcontext context = application.context;
 5    bool issafe = true;    //是否合法链接
 6    string uri = context.request.url.absolutepath.tolower();
 7    if (uri.lastindexof(".") > 0 && context.request.urlreferrer != null)
 8    {
 9        string exp = uri.substring(uri.lastindexof("."));
10        //这里是判断文件后缀名是否在排除的文件类型列表之内
11        bool ishas = classlibrary.rdata.rstring.strisincusesc(exp, config.imgsafetype.split('|'));
12        if (ishas)
13        {
14            string domainoutter = context.request.urlreferrer.authority.tolower();    //包含域名和端口
15            arraylist arry = common.cache.getdomainvalid();//取系统定义的合法的域名绑定列表
16            issafe = arry.contains(domainoutter);    //判断当前请求的域名是否在合法列表之内
17        }
18    }
19    //下面就是不合法的时候的输出了,如果有默认替代图片则输出,如果没有就生成一个,格式为.gif
20    if (!issafe)
21    {
22        bitmap img = null;
23        graphics g = null;
24        memorystream ms = null;
25
26        try
27        {
28            string picpath = classlibrary.rpath.getfulldirectory("images/unlawful.gif");
29            if (file.exists(picpath))
30            {
31                img = new bitmap(picpath, false);
32            }
33            else
34            {
35                img = new bitmap(64, 64);
36                g = graphics.fromimage(img);
37                g.clear(color.white);
38                font f = new font("宋体,黑体,arial", 9,fontstyle.bold);
39                solidbrush s = new solidbrush(color.red);
40                g.drawstring(resources.message.lawlesslink, f, s, 1, 20);
41                img.save(picpath, imageformat.gif);
42            }
43            ms = new memorystream();
44            img.save(ms, imageformat.gif);
45            context.response.clearcontent();
46            context.response.contenttype = "image/gif";
47            context.response.binarywrite(ms.toarray());
48            context.response.end();
49        }
50        catch
51        { }
52        finally
53        {
54            if(g != null )
55                g.dispose();
56            img.dispose();
57        }
58    }
59}

  凡是有利必有害,这样做最大的缺点就是增加了系统开销,客户端的每一请求都要过滤一遍,性能自然要打折扣了。不知道哪位朋友有更好的办法,或者优化的方法,一起来探讨探讨。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表