CakePHP

目前,此分类下共有文章 4 篇。

有效地阻止SPAM

| 3 条评论 2008-06-17 10:24:30

对于blog作者来说,SPAM一直是个令人比较头疼的问题。如果没有良好的防治机制,一旦被SPAM机器人盯上,那可不是闹着玩的。目前主要的解决方案是使用Captcha,让真正的留言者按照图片所示,输入一串随机生成的字符串,或是解答数学题等等。虽然攻击者仍可以写程序做图像识别,但这个难度很大,而且一旦图案有变化程序就要重写。因此CA..可以说是目前最为有效的SPAM预防方案。

但是Captcha显而易见的缺点就是:它的用户体验不好,有时甚至很糟。我见过的最恐怖的Captcha来自RapidShare,它居然要你识别一只特定形象的猫!我每次做完这步眼睛都花了!

还有一种使用也比较广泛的方法,就是利用贝叶斯等算法做SPAM识别,有些还结合了可定期更新的黑名单机制。Gmail这方面做得非常好-99%的垃圾邮件都被系统识别并自动归类了。问题是,我始终担心会有重要邮件(比如MM的求爱信……)被误判,还要时不时的去“垃圾箱”中看看。

此外也有人借助Javascript来防SPAM,因为机器人抓取网页时肯定不能运行Javascript,所以可以利用这个特点,通过浏览器事件来辨别留言者的身份。这个方法在Javascript被用户禁用时显然会失效,考虑到Firefox用户可以非常方便地禁用Javascript,我对其持保留态度。

说了半天别人的方法,我介绍一下在我的blog程序Lonely Thinker中的做法。经过半年多的检验,这一方法被证明不仅可以有效地阻止SPAM,又几乎不损害用户体验。

步骤如下:

1、在表单中添加一个值为空、名称为antispam的文本域,将其放在一个HTML容器内(比如div),并用CSS这个HTML容器隐藏(如下图):

view中的代码

2、在表单校验的部分加入对这个文本域的校验,如果其值不为空,则说明当前留言是SPAM(以CakePHP框架的model为例,代码如下):

model中的代码

简单地说,这种方法就是利用了机器人会填写所有表单域的特点而起作用的。唯一可能需要担心的,就是如何处理关闭了CSS的情况。我的做法是在表单中添加一段文字说明,你仔细看上图的话不难发现。

要特别说明一下为什么不直接把文本域用CSS设置为隐藏的。我本来是这样做的,可是发现机器人非常聪明,它似乎有一个简单的解析器,可以读取文本域的CSS,如果发现具有隐藏属性则跳过。前一阵子产生的SPAM都是这么来的,我找到原因时也非常惊讶。

当然了,机器人的作者仍然可以进一步完善他的程序,比如写一个比较完整的HTML解析器,用以对付我目前采用的隐藏HTML容器的做法,但这个有一定的难度,并且我只要让我的HTML不合法(比如没有完整闭合,或者制造标签间的嵌套错误),他的解析器很可能就失效了。

如果你的blog访问量非常大,已经到了有人专门针对你的blog写SPAM机器人的程度,上面的方法就需要改进才行了。我目前想到的一个办法是动态地调整文本域的名称,比如在一个名称池中随机的选取一个渲染到表单里,并在model验证规则的部分做动态调整。为了防止误伤那些在名称调整前载入页面、名称调整后递交表单的用户,甚至可以考虑临时记录每个人载入的文本域的名称。

LonelyThinker 0.4预览

| 3 条评论 2007-12-07 00:53:02

LonelyThinker(LT)就是你现在看到的这个blog程序,目前的版本是0.3.2007112801。因为我很可能会把这个程序开源(我知道WP、MT等程序很棒,可总有人需要点不同的东西,对吧),所以特别在此记录下来它一路的发展轨迹。在0.4版中,我计划有如下变动:

确定每个版本升级所遵循的原则,以及版本号的规则

从0.4版开始,每次升级都会至少增添一个重要的功能、或是对已有功能进行大幅度更新。当我确定下一版本的升级目标后,会立即一步步修改线上的程序,并同时更新修订版本号,直到我觉得这个目标已经达成,此时就会更新主版本号。至于版本号的规则,则从现有的“主版本号.日期+当日修订版本号”变为“主版本号.修订版本号.日期”。

比如,我决定在LT 0.4中增加一个名为“iconment”的功能,并以此作为升级目标。那么我会在接下来的一段时间里不断的升级程序,版本号也会由现在的0.3.2007112801变为0.3.2.20071128、0.3.3.xxxxxxxx、0.3.4.xxxxxxxx……,直到我认为这个功能完成了,才会正式发布0.4版的LT,届时版本号会是0.4.0.xxxxxxxx这样的格式。

iconment

这个词是“icon”和“comment”的合写,意思是带有图标的评论。这里的“图标”一方面指的是评论内容中的表情图标,更重要的,则指评论者的头像图标。

表情图标实现起来比较简单,无非就是利用正则表达式替换字符串;但头像图标的实现则要花点心思。我计划使用Gravatar的服务结合自己编写的程序,来实现评论者头像图标的管理和显示。用OmniGraffle画了个流程图草稿,如下所示:

此外,iconment还将包含以下改进:1)评论订阅。评论者可以订阅他所评论文章的最新评论,这样他就不用总跑到那篇文章下面看看有没有人回复他的评论了;2)待定 :)

Spam防火墙

因为没有做统计功能,我不清楚现在blog上几乎看不到Spam的原因是什么,是因为机器人不认识评论表单的代码(以前用WP时每天Spam多得要命),还是现在的防Spam机制真的管用?无论怎样,我仍然看到有漏网的Spam。在LT 0.4中,我会大幅度完善Spam处理机制,同时力争做到像现在一样不影响用户体验-你仍然不需要输入一个莫名其妙的单词、或是回答一个数学题什么的。

新blog、CakePHP、jQuery和其它

| 2 条评论 2007-11-11 22:46:01

有两个多月没有更新过这里了,这段时间陆陆续续地写着新blog(如你所见)的程序,工期远远超过了原有的预想,甚至直到现在我也没能最终完成原计划的功能!因此写这篇文章的目的,就不仅仅在于表明新blog的开张,还在于把其间的一些感受和经验分享出来。

CakePHP

这是一个PHP的开发框架,基本上,你可以把它看成是Ruby on Rails的PHP实现。我于05年春天接触到Cake,并当即用它给一个客户做了个网站(我有时会利用业余时间做网站,算是赚外快吧),当时就被这个框架的魔法(“automagic”)迷住了,并一直使用至今。

应该说,Cake的功能是非常强大的,Rails的思想很容易让初次接触的人着迷,然而用的越多,我却越来越陷入一个两难的困境:Cake能让你在极短时间内畅快地完成一些支持“魔法”的任务,比如ActiveRecord、Routes(类似URL映射)和Cache处理等,然而在不支持“魔法”的任务上,你不得不花极高的成本、以不怎么优美的方式去完成,最终的结果,便是前者所带来的效率提升往往被后者所抵消甚至超过,因此要么放弃Cake并花费许多精力自己从头构建一个框架,要么在Cake上花更多的学习时间。

出现这一问题的原因有很多,除却我自己的水平问题外,可以归结为以下几方面:

  1. 文档缺乏。毫不夸张的说,我有50%的时间都花在找文档上。作为号称最流行的PHP开源开发框架,Cake文档的缺乏到了令人发指的地步!官方只提供了一个内容不多的手册(Manual)、一个API查询站点(谢天谢地,虽然内容非常简单,但至少提供了API查询)、一个Google Group和一个称为“Bakery”的社区。核心开发小组中没有人出来解释一下隐藏在成千上万行代码下的Cake到底是如何运行的,手册只能让你对整个框架有个非常初步的认识(最新的1.2版甚至连手册都没有!),API库中的函数功能描述往往语焉不详,没有示例,甚至连参数和返回值都没有相应说明,从我的个人经验来看,要解决一个问题,最有效的方式就是在Google Group中不停的搜索。

    Cake的开发小组如果真想让更多的人了解和使用Cake,与其不停地增加新功能,倒不如花时间在写文档上。

  2. 设计更新太频繁当然这只针对尚处于“pre beta”阶段的1.2版而言,然而即便如此,变化的速度还是有些快了,用了一个月的函数在新的nightly版中失效,或是处理逻辑上出现大的变化,这样的例子屡见不鲜,让人很难适应。

在对Ruby及RoR做出了一段时间的考察后,我越来越倾向于放弃Cake并转移到RoR上来。

jQuery

这是我见过的最棒的Javascript框架!我曾经花了几个月的时间去了解和评估当前的一些JS框架,尝试了PrototypeMoo ToolYUI/YUI ExtQooxdoo等等一系列框架,最终被jQuery强大的功能、简洁优雅的语法、方便的扩展性和庞大的用户群所吸引,并决定以它作为今后几年的主力JS框架。如果你还在为做出正确的选择而犹豫不绝,或者喜欢Ruby那种接近自然语言的语法,我强烈推荐jQuery。

Qooxdoo(QX)

此外要提的是Qooxdoo(QX)。它的设计思路明显不同,其它JS框架可以说是对由HTML/CSS构成的用户界面和行为的补充,但QX则不仅完全以其自身来构建用户界面,而且还提供了许多其它类库。给我的感觉是,其开发团队要么野心非常庞大,要么就是思路的确与众不同。

CSS

做网页也有8年多的时间了,这是我第一次完全弃用表格、并使用CSS定位。对我这个初学者来说,使用CSS最爽的便是逻辑和控制。各个HTML元素、或者说样式定义都能体现彼此间的逻辑关系,这样事物会显得井井有条;其次,使用CSS而不是表格来控制布局,可以真正做到灵活多变,这是表格布局很难做到的;此外,CSS的定义方式很好的体现了“Dont't Repeat Yourself(DRY)”的思想,尤其适于我这种懒人。总的来说,使用CSS布局是一种令人愉快的体验。

当然问题也不是没有,各个浏览器对CSS支持的程度和方式不同,也是非常头疼的一点。并且在Windows下我还没有找到像CSSEditCoda这样好用的CSS编辑器。

啰啰嗦嗦地说了一通,其实心里还是很高兴新Blog开张的,:D

jQuery的Ajax在特定版本的IE下执行失败

| 3 条评论 2007-08-27 15:49:01

最近一直在用CakePHPjQuery做东西,不亦乐乎。昨天突然发现在版本号为6.0.2900.2180.xpsp_sp2_gdr.070227-2254的IE上,jQuery内建的Ajax功能无法使用,用ajaxError这个callback可以捕捉到相关的错误,IE给出的提示是”对象不支持此属性或方法”。 Google了一阵子发现我所遇到的情况并非个案,以下是一些相关的讨论: 其中第四条来自于jQuery的Trac,原作者直接提到了这一问题,可惜处理结果居然是”won’t fix”(不会修正)。 诸位有什么好办法?

关于

丁宇(Felix Ding),电脑Geek,狂热的爱书和爱乐分子。现就职于上海的一家设计工作室。

我的Email:

订阅到RSS