2009-03-21

不使用验证码如何防止恶意的代码攻击

本文主要参考http://15daysofjquery.com/examples/contact-forms/
主要思路包括:
  1. 在载入注册页面A(以此为例,类似的还包括有登录页面,评论页面等)的同时,由系统载入另一文件B
  2. 文件B的作用是:1)以服务器时间和一个秘密字符串共同加密为一段单向字符串 2)将这段生成的单向字符串设置在用户的cookie中 3)将系统时间作为hidden字段加入用户的表单中
  3. 用户提交表单后,服务器可根据hidden字段的字符串+秘密字符串以相同的加密算法重新生成一个字符串,如果与用户浏览器中设置的cookie相同,则认为是用户操作,予以继续操作的权限,否则认定为恶意代码,提示出错。
好处:
  • 无需烦人的验证码的加入
不足:
  • 需要客户端的cookie和JS支持

2009-03-18

关于使用第三方SMTP服务器发送系统邮件的问题

如题,这可能是每个没有多少财力但又不能缺少系统邮件这项功能的程序员们都必须面对的问题,限于财力,我们不能架设自己的SMTP服务器,所以只能借助第三方的免费的SMTP服务器了,如是乎,有了思路:
最先出来的思路肯定是诸如163,sina,sohu这样的Email ISP的SMTP服务器,我们注册账号然后使用这个账号来转发我们的系统邮件,并且更改邮件头,使其符合我们需要的发信人,收信人.开始时你可能会觉得这方法不错,可是,不久问题就会出来——
  • 那就是目前的163不能自主更改邮件头,否则会验证失败,而诸如sina的可用性也值得考虑,在我的实验中,没有成功过几次。
  • 更重要的一点是,如此的使用第三方的服务器,势必会造成此账号的异常,可能会被封号,或者会涉及到法律问题
所以,这种方法的可用性是用你的使用频率成反比的,你可能会申请多个第三方的账号作为随机的SMTP服务器以平摊压力,但是某个账号的异常必然会影响到系统的可用性,所以这种方法只能是次选。

最近我正好遇到了这样的问题,也是首先使用前文中的方法,但最新注册的163,sina账号的验证已不能通过(可能ISP在服务器端作了相关的验证,但一些旧的账号依旧可用),经过一番调研,最终得出了一个相对可用性有百倍提高的方法——使用GAE的Email服务,这是google允诺免费提供的服务,因而可用性方面得以保证,经过实验后,总结以下的几点不足:
  • GAE经常会被和谐,这是很致命的,所以可结合方法1来提高可用性
  • GAE的邮件可能有若干分钟的延时
  • 对于免费的GAE服务,似乎有相关的限制(待调研确定)
  • 其它
但总体而言,这两种方法结合起来,我们要实现免费的SMTP系统邮件服务那是没有什么问题的。

2009-03-15

访问google code/group常用的代理(可用的)

由于最近不能访问google code和google group,给学习生活带来了极大的不便,最后决定使用代理来解决,收集了一些可用的代理如下:
  1. 72.55.191.6:3128
  2. 128.2.223.65:3124
  3. 209.85.143.166:80(推荐,据说是google us的,访问google code不错,但是group就出错)
更多参见http://www.cnproxy.com/

2009-03-14

VIM使用相关技巧(我经常忽略的)

已经很习惯使用VIM进行种类编辑了,无论是WIN下或者LINUX下,即使如此,很多常用的命令还不是十分掌握,直到今天看了这篇文章(系VIM的主要作者撰文),故总结如下,以备遗忘:
  1. c w用于删除当前光标下的word,然后进入插入模式,在被删除word位置进行插入
  2. .(dot) 用于重复最近一次变动
  3. 宏操作“ q a 一个操作 q“, 那么输入@a则会重复引号中的“一个操作”,如"qa o寄存器中的测试.<esc>q"那么a寄存器中会记录下"o寄存器中的测试.<esc>"这段操作。VIM提供26个寄存器(a-z)
  4. [+I(注意是i的大写),显示当前光标所在单词的所有出现行号
  5. mk标记光标所在行为k,'k则可跳至标记行行首,'k可用作行号的代替,如从当前行删除至'k标记行,可使用 d'k
  6. 代码折叠 使用visual mode选择待折叠代码,然后使用zf命令或者:fold命令进行折叠,也可以使用 :10,20 fold进行对10至20进行折叠。zo打开折叠,zc关闭折叠
  7. tags.首先使用ctags对源文件生成tag,使用在vim中调用,如:tag fun_name,可跳至fun_name声明的地方(可能不在同一个文件中),:ptag tag在预览窗口中预览tag的定义,<ctrl>+]查找光标下tag的定义

关于"更新"的反思

嗯,这里的更新包括一些软件的更新,辅助产品的更新等,例如从ubuntu 8.10 upgrade至9.04,从无品牌的泳镜到品牌的,这中间的转化在很多人来看都是自然而然的事,可是是否想过,这些更新对于自己的生活或者体验真的有意义吗?
从昨天开始,开始把系统从ubuntu 8.10升级到9.04(alpha 6),想想升级的原因竟然是对于VIM更新的需要(8.10默认是VIM7.1,而我需要的是7.2),再追根竟然是对于VIM中对于HTML编辑的更多智能支持(如智能能对齐等)。因而一气的,我从8.10升级9.04失败(进不了desktop)后,昨天又直接下载9.04的安装iso,今天使用wubi安装,总算是成功了,可是很多已有的软件确已丢失(如firefox的相关插件等),但是想想,最早的出发点解决了吗?
回答是“没有!”,VIM还是不支持我所谓的智能化,但最终的解决还是在早上用VIM的script来解决了。
我在想,整个过程是一种多大的浪费,何况于我老将“时间是最珍惜的资源”挂在口头!
当然,这个过程往往都在重复着,事无巨细地,每天每时,直到今天我真正去反思。
珍惜时间资源,不在于你每时每刻都那么忙碌,而在于你在做每件事时真正掌握了合适而正确的方法,譬如,这件事,我想正确的步骤应是:
  1. 确定我的目标(使用VIM支持HTML的智能性)
  2. 论证目标的实际意义和对工作带来的实际作用,决定是否进入下一步
  3. 搜索解决办法(找更相关的资源,而不是自以为是地就认为更新版本支持,而是在官方网站寻求解决方案)
  4. 通常上面就可以解决,如果不能,则在搜索引擎寻求解决方案
  5. 评估解决方案的成本与目标带来帮助的大小,决定是否解决此问题
  6. 完成一个事件的解决或者放弃解决
所以,当面对"更新(广义)“时,首先确认更新之于自己的价值,然后依照上述的步骤进行操作,实现时间的有效利用。