关于图片盗链这个问题,毕竟是自己的劳动成功,很多人不希望别人就那么轻易地偷走了。 这个功能在很多的论坛上都具有,可能是因为盗链的行为太多了吧
反盗链的程序其实很简单,熟悉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}
凡是有利必有害,这样做最大的缺点就是增加了系统开销,客户端的每一请求都要过滤一遍,性能自然要打折扣了。不知道哪位朋友有更好的办法,或者优化的方法,一起来探讨探讨。
新闻热点
疑难解答