网站优化研究之图像资源网站优化矢量图形下载站优化 之 图形防盗链 以及 缓存图像数据,节省硬盘IO

各位程序员,你们好. 很久没有写文章. 上google 一看,发现我的写的文章,被copy转载的很严重.
如google: 木马技术研究   并且还不写出处,作者未知.

 

特此在文章开始本人声明:
如有转载必须带上出处: 阿呆 - 音乐是流动的字符,字符是沉睡的阿呆( http://blog.youkuaiyun.com/davemin/ )

然, 无论如何可以说明我写的东东还有些价值,因此本人就以前没有写完整的技术点, 补充说明.
本文属于补充 GDI+实例教程 技术相关在网站中的一点应用.
GDI+实例教程: http://blog.youkuaiyun.com/davemin/category/217235.aspx


1. 问题: 以巨量图像作为资源的图像网站, 如何维持网站自身的价值, 以及提高网站性能
示例网站A: http://www.logospace.cn 矢量标志下载_LOGO_矢量图形下载_书法字体 - 标志空间 ( 始于2006 )
示例网站B: tucoo 图库 ( 始于2001, google 图库可以知道url ) 等国内众多主流技术实现的网站.
不举国外的例子了.
(声明: 如本人对图库等站只是实事求是说事,并无攻击,反对,胡说,绯傍等等反面意思. 本人所说都是本人实际查实之事.
并希望我的技术研究,能为这些网站提供一定技术参考.
声明:本人并没有对示例网站A作推广宣传等,也没有攻击,反对,胡说,绯傍等等反面意思, 更没有泄露网站机密等情况.本人所说都是本人实际查实之事)


这两个类型站提供的内容有相同之处, 都是提供以图象为资源的内容.
大家先随便用用这两个网站会发现:

 

宣传: VC10年技术QQ群: 30107096 (欢迎VC资深程序员加入,本群只讨论VC技术)

 

 

以下几点, 对于国内众多主流技术实现的网站:
A. 图库上的图像是绝对地址, 如果程序员写程序,可以随时下载下来.
   图像相对应的矢量资源, 往往也是直接地址, 或者是zip 格式的地址, 图库网上确实有加密码. 其实这一些对于程序员来说, 太简单.
   只需要写一个程序完全可以全部下下来.全部解开. 不消X天时间,可以取到X.

B. 图像地址不能随时灵活更换.

C. 甚至可以使用穷举/猜测/sniff 等等技术,得知没有权限下载的图像的地址,而能直接下载
   本人见过国内很多艺术品相关网站,有此通病. 相关网站对重要图像也加上flash 等查看方式以限制权限.然本人以为无效.

   原因是: 图像就放在网站www目录下面.

D. 图像资源丰富, 流量较大, 导至服务器经常性读取图像
   图像文件基本上都比较小, 如: 1K - 100K 之间.  数量巨大.

   从性能以及计算机的角度来看, 这是非常浪费硬盘的. 本人就是有过这种经历, 一只服务器硬盘坏道无限多.

E. 就是防盗图象的工作.

 

 

2. 建议采用的方法


A. 所有图象等资源都放到网站www 目录之外, 目录结构可以这样:
   F:/MyWebsite
   F:/MyWebsite/Data/   放数据
   F:/MyWebsite/Data/Image/   放图像 
   F:/MyWebsite/Data/Image/Ai   放Ai格式图像
   F:/MyWebsite/Data/Image/Ai/200809  放2008.09月的Ai格式图像
   F:/MyWebsite/www/   放网站

   这样可以避免 穷举/猜测/sniff 等等技术,得知没有权限下载的图像的地址, 资源安全性提高了.

 

B. 图像采用简接导出

   如: image.aspx?id=0809000001

   监于对google,baidu等的友好, 可以使用urlrewrite 技术实现 url 为: image/0809000001/image.jpg 这样的形式
   对SEO 是大有好处的. 感觉像直接地址. 其实还是: image.aspx?id=0809000001 地址.
  

C. 图象防盗链
   C.1. 只许可本网站使用
   以Asp.Net为例: Request.UrlReferrer.AbsoluteUri 是否存在本站的域名,就可以知道是不是在本站打开这个图的.


   C.2. 许可直接打开
   以Asp.Net为例: Request.UrlReferrer.AbsoluteUri 为空的情况便是

   如果是其他情况打开,可以在图像上增加画上如: 本图像出处XXX图这样的文字.


D. 使用IIS缓存,缓存图象数据, 减少节省硬盘IO开支
   以Asp.Net为例: HttpRuntime.Cache.Insert, HttpRuntime.Cache.Remove 可以操作缓存

   缓存key 可以设置为: 绝对路径或者是相对路径, 缓存数据为图像文件的byte[]数据. 缓存时间可以为数小时.


E. 反程序无限下载,可以写代码限止10分钟内下载量>5等这样的情况. 以及需要输入验证码都是可以考虑的.

 

 

 

3. 本人设计的相关asp.net C#代码参考


下面这个API 为根据图像路径得到图像数据. 如果有缓存,从缓存中得,如果没有那么从硬盘得到,并加入缓存

  1.    public static byte[] Find( string imagePath )
  2.   {
  3.    string key = "IS_" + imagePath.ToLower();
  4.    object obj = HttpRuntime.Cache[ key ];
  5.    ifnull == obj )
  6.    {
  7.     if( !File.Exists( imagePath ) )
  8.      return null;
  9.     FileStream fileStream = File.OpenRead( imagePath );
  10.     if( fileStream.Length == 0 )
  11.     {
  12.      fileStream.Close();
  13.      return null;
  14.     }
  15.     byte[] data = new byte[ fileStream.Length ];
  16.     fileStream.Read( data, 0, data.Length );
  17.     fileStream.Close();
  18.     HttpRuntime.Cache.Insert( key, data, , DateTime.Now.AddMinutes( 60 ), TimeSpan.Zero );
  19.     return data;
  20.    }
  21.    return (byte[]) obj;
  22.   }

下面这个API, 断定是不是需要防盗


  1.   public static bool IsSpam(Page page)
  2.   {
  3.    string referrer = "";
  4.    ifnull != page.Request.UrlReferrer )
  5.    {
  6.     referrer = page.Request.UrlReferrer.AbsoluteUri;
  7.    }
  8.    referrer = referrer.ToLower();
  9.    bool isSpam = false;
  10. #if DEBUG
  11.    if( referrer.IndexOf( "localhost/mywebsite" ) == -1 )
  12.     isSpam = true;
  13. #else
  14.    if( referrer.IndexOf( "mywebsite" ) == -1 )
  15.     isSpam = true;
  16. #endif
  17.    return isSpam;
  18.   }

 

导出页可以使用如下代码: (当然导出页需要先写好header,Response.ContentType等)

  1.    if( !IsSpam(page) )
  2.    {
  3.     page.Response.OutputStream.Write( data, 0, data.Length );
  4.     return;
  5.    }
  6.    // convert data to bitmap
  7.    MemoryStream s = new MemoryStream( data );
  8.    Bitmap bmp = new Bitmap( s );
  9.    Bitmap bitmap = DrawSpamImage( ref bmp );
  10.    bmp.Dispose();

 

DrawSpamImage API实现参考:
Bitmap bitmap = new Bitmap( bmp.Width, bmp.Height ); //建立空图像
Graphics g = Graphics.FromImage( bitmap );//得到graphics, 然后可以随写画了. 可以先画上原图,再画上: 本图像出处XXX图这样的文字.

 


本人了解国内大多网站并没有采用这些技术中的一种或者多种,不管这些网站是asp.net实现还是asp或其他实现.
然,还是有极少部分网站有采用这些技术,如前面提到 示例网站A LOGO资源站 http://www.logospace.cn
程序员可以参考这个站的一些实现.

宣传: VC10年技术QQ群: 30107096 (欢迎VC资深程序员加入,本群只讨论VC技术)

本文出自:阿呆( http://blog.youkuaiyun.com/davemin/ )
时间:2008-09-10


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值