各位程序员,你们好. 很久没有写文章. 上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 为根据图像路径得到图像数据. 如果有缓存,从缓存中得,如果没有那么从硬盘得到,并加入缓存
- public static byte[] Find( string imagePath )
- {
- string key = "IS_" + imagePath.ToLower();
- object obj = HttpRuntime.Cache[ key ];
- if( null == obj )
- {
- if( !File.Exists( imagePath ) )
- return null;
- FileStream fileStream = File.OpenRead( imagePath );
- if( fileStream.Length == 0 )
- {
- fileStream.Close();
- return null;
- }
- byte[] data = new byte[ fileStream.Length ];
- fileStream.Read( data, 0, data.Length );
- fileStream.Close();
- HttpRuntime.Cache.Insert( key, data, , DateTime.Now.AddMinutes( 60 ), TimeSpan.Zero );
- return data;
- }
- return (byte[]) obj;
- }
下面这个API, 断定是不是需要防盗
- public static bool IsSpam(Page page)
- {
- string referrer = "";
- if( null != page.Request.UrlReferrer )
- {
- referrer = page.Request.UrlReferrer.AbsoluteUri;
- }
- referrer = referrer.ToLower();
- bool isSpam = false;
- #if DEBUG
- if( referrer.IndexOf( "localhost/mywebsite" ) == -1 )
- isSpam = true;
- #else
- if( referrer.IndexOf( "mywebsite" ) == -1 )
- isSpam = true;
- #endif
- return isSpam;
- }
导出页可以使用如下代码: (当然导出页需要先写好header,Response.ContentType等)
- if( !IsSpam(page) )
- {
- page.Response.OutputStream.Write( data, 0, data.Length );
- return;
- }
- // convert data to bitmap
- MemoryStream s = new MemoryStream( data );
- Bitmap bmp = new Bitmap( s );
- Bitmap bitmap = DrawSpamImage( ref bmp );
- 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