Archive for December, 2009

Date: December 31st, 2009
Cate: Blog

Finally gone, the f**king 2009

Better go to sleep now, it’s nothing to me.

Date: December 27th, 2009
Cate: Blog, Technic
17 msgs

Micolog一个阻止spammer的小技巧

之前还因为一封有趣的邮件觉得spammer们很可爱,没过几天博客就遭到了spammer的轮番轰炸,最开始是每天几条,然后某天早晨当我醒来,等待我的就是500多条垃圾留言,而且还在持续增长,我当时就傻眼了。把那篇日志都删除了,可留言居然都还能发进来,可能是Micolog的一个bug了。只能修改了评论的提交地址,这才阻止了spammer的进攻(blog.py大概第560行)。可好景不长,今天早上醒来,迎接我的又是500多条垃圾留言,于是开始寻找一个阻止spammer的好办法。

从GAE的后台日志中可以看到,spammer的机器人只下载了html文本页面,而其中的所有元素,包括图片、js和css等都不下载,同时我还猜测,这个机器人肯定也没有解析html中的js代码。于是我就把评论的提交地址用js写到网页中,可还是被识别到了,于是又猜测,spammer不会管你网页的结构是怎样的,它只管从中搜索 “<form action=提交网址>” 这样的字符串,找到提交评论的地址,然后就开始不停地向这个地址发送垃圾留言,甚至连网页都不用下载了,所以即使我已经删除了某篇日志,评论还是可以发进来。至于Micolog的"1+1=?"的验证,完全就是一个摆设,可能骗幼儿园的小朋友还行,机器人只要不提交那部分数据就行了,也就是说,完全忽视验证码的存在。

既然spammer们要找的是提交地址,那我就只好把它隐藏起来了。一种方法是把提交地址写到一个外部js文件中,然后在网页中调用。因为机器人不会下载外部js,所以它是找不到提交地址的。

document.write("<form action='/post_comments_and_fuck_spammers' method='post' id='commentform'>")

或者使用javascript压缩加密工具把提交地址处理一下,http://www.codebit.cn/packer.php,上面的js代码就变成了

eval(function(p,a,c,k,e,d){while(c--)
{if(k[c]){p=p.replace(new RegExp('\\b'+c+'\\b','g'),k[c])}}
return p}('2.1("<0 3=\'/4\' 7=\'6\' 5=\'8\'>")',9,9,
'form|write|document|action
|post_comments_and_fuck_spammers|id|post|method|commentform'.split('|')))

之后就该修改一下Miclog的comment.html,把“<form action="/post_comment" method="post" id="commentform">“替换成上面的js。不过正常的访客也必须要启用javascript才能提交留言,所以还要加上一段提示信息并隐藏留言框,再给spammer们提供一个虚假的提交地址:

<noscript>Javascript must be enabled to submit comment<div style='display:none;'><form action='/fuck_spammers' method='post' id='commentform'></noscript>

最后“</form>”之后再加一句:

<noscript></div></noscript>

也许你还可以给欺骗spammer的虚假提交地址上加点东西。^^一直到现在,昨夜里的那个疯狂机器人还在孜孜不倦地刷新着那个侮辱它的页面,我的心终于平衡了一点。spammers

Date: December 24th, 2009
Cate: Blog, Technic
13 msgs

Opera 10.50和新的opera:cache

Opera 10.50发布已经两天了,不巧发布的第二天我们就有考试,所以不敢玩啊!昨晚考完试才开始玩起10.50。新功能和特性就不用我再一一重复了。支持CSS3里的圆角属性,所以你现在可以在Opera里看见我博客主题的圆角效果了。卡拉看(Karakan)这下终于让藕粉们扬眉吐气了,接着各种评测马上跟进,Opera的得分超过Chrome,重回“速度”榜排行第一。但其实这样的评测在我看来除了市场宣传以外没有任何实际的意义。我猜Chrome就是靠这样评测才迅速获得那么多市场占有率吧,但一个光秃秃的Chrome真的好用吗?把Chrome作为主力浏览器的又有几个呢?当然,Chrome现在逐渐加入新的功能。js的速度只是评价一款浏览器好坏的一方面,更多的还是综合的可用性,这一点在国内的众多的IE壳上体现得尤其充分,速度都是IE6的,但易用性却远远超过没有装扩展的Firefox,所以才吸引了那么多的用户。

所以我也没太去关心10.50的速度,至于BUG嘛,绝对配得上pre-alpha的称号,如果你遇见了也请不要见怪,不能对一款pre-alpha的软件要求太多。

对比10.10 1893, 10.50增加了也删去了一些命令:

增加的命令:

  • Archive message
  • Clear Previous Searches
  • Clear Search Field
  • Close private tabs
  • Invoke dialog
  • New private browser window
  • New private page
  • Search Not Found
  • Search Wrapped
  • Select
  • Show find text
  • Show Menu Section
  • Show search dropdown
  • Wand Never Save
  • Wand Save

删去的命令:

  • Delete
  • Follow Image Description URL
  • Save
  • Select Blank Page

看到Invoke dialog这个命令时我心中窃喜,从字面上看像是直接从dialog.ini中调用对话框,就像我们用show popup menu从menu.ini中调用菜单一样。这不正是我想要的功能吗?我甚至还在Opera的wish list里专门请求了一下,没想到10.5中加入了。可试着用这个命令调用对话框,却怎么也不行,在Opera自带的配置文件中也没有找到使用了这个命令的地方。也许功能还没有完善吧,但愿如此。如果真的可以像调用菜单那样自由地调用对话框的话,Opera的可定制性将再上一个台阶。

新版本中还有一个新功能我非常喜欢,就是变得异常强大的opera:cache。以前的opera:cache只能按时间顺序列出所有的缓存内容,而且缓存稍微大一点的话打开就会很卡,而现在的opera:cache不仅速度更加流畅,还可以按照域名、文件类型和文件大小等进行过滤,喜欢从缓存中找那些被隐藏保护的流媒体的人一定会非常喜欢。

可以使用“opera:cache?domain=&validation=&list=list&min_size=&max_size=&mime=”这样的形式直接指定想要的内容,我把其中可以使用参数总结了一下:

文件类型和对应的参数

  • 1000    text/html
  • 1001    application/xml
  • 1002    image/svg+xml
  • 1008    text/plain
  • 1009    image/gif
  • 1010    image/ipeg
  • 1013    image/bmp
  • 1015    audio/x-wav
  • 1016    audio/midi
  • 1022    video/mpeg
  • 1023    video/mp4
  • 1031    application/x-javascript
  • 1032    image.png
  • 1034    test/css
  • 1040    image/x-icon
  • audio_mpeg    audio/mpeg
  • video_flv    video/flv
  • video_x-flv    video/x-flv

其他的参数:

  • min_size 最小文件尺寸,单位KB
  • max_size 最大文件尺寸,单位KB
  • domain 指定域名下的缓存,只有在没有指定文件类型时才有效
  • list list:用列表的形式显示缓存;preview:预览缓存

顺手写了个菜单,功能是查看当前域名下的缓存内容,查看不同类型的缓存文件,清空缓存。 [Opera Cache Menu]
Item, All = external action,,,,find | edit site preferences & delay,10 & go to line start & insert,"opera:cache?domain=" & go to line end & insert,"&validation=&list=list&min_size=&max_size=" & select all & copy & cancel & delay,10 & go to page,"%c"
Item, Audio =external action,,,,find | go to page, "opera:cache?domain=&validation= &list=list&min_size=0&max_size=1000000 &mime=1015&mime=1016&mime=audio_mpeg"
Item, Video = external action,,,,find | go to page, "opera:cache?domain=&validation=&list=list&min_size=0 &max_size=1000000&mime=1023 &mime=1022&mime=video_flv&mime=video_x-flv"
Item, Image = external action,,,,find | go to page, "opera:cache?domain=&validation=&list=list&min_size=0 &max_size=1000000&mime=1010&mime=1009 &mime=1032&mime=1013&mime=1002&mime=1040"
Item, Web Element = external action,,,,find | go to page, "opera:cache?domain=&validation=&list=list &min_size=&max_size=&mime=1000&mime=1034 &mime=1031&mime=1001&mime=1008"
----------------1
Item, Empty Cache = external action,,,,delete | clear disk cache

猜想圣诞节后等Opera的员工开始上班,我们就可以陆续拿到新的10.5测试版了,10.2不会再更新,桌面widget会加入到以后的10.5中,也就是说Opera从10.1直接跳到了10.5,以后两个版本会同步更新,情形类似以前的9.6和10.0 Beta。

再附送一个新发现opera:bookmarks

Date: December 24th, 2009
Cate: Blog, Technic
3 msgs

Opera内部命令清单

一直觉得Opera官方提供的自定义的信息太少了,连个命令清单都没有,我们用的都还是民间收集的。operawiki上有一个命令清单,不过有点老了,还是9.2时代的。之后Opera又添加了很多新功能,但从来没有告诉我们又添加了什么新命令,以前只有在ini文件中去找新功能对应的命令。今天在Opera里编辑鼠标手势时发现命令一栏里有自动完成功能,会把Opera里所有的命令都显示出来,于是灵机一动,猜想应该可以从Opera程序本身中把这个清单提取出来。果然,把opera.dll脱壳之后用十六进制编辑器打开,搜索一下就找到了。

版本号是1893,一共有815个命令,真多啊!

more))

Date: December 17th, 2009
Cate: Blog, Technic
27 msgs

一个Opera的高级代理菜单

请先参考这篇文章。这次没有使用set preferences命令,而全部改用模拟对话框的操作,因为set preferences会让浏览器卡住一两秒钟。另外还添加了一点新功能,把地址栏或者剪切板中的地址设置为代理IP,把当前网址添加到代理例外列表,在Opera中调用,并且可以关闭外部代理程序。目前想到的就这么多,还有什么有创意的想法欢迎告诉我。

点击这里,用文本编辑器打开其中的文件,把下面的代码复制到最后,保存,记得编码一定要是UTF-8,不然会乱码。打开Opera。然后把这个按钮拖放到Opera的工具栏中:Proxy Menu Pro

[Proxy Menu Pro]
--------------------1
Item, "手动设置代理..."="external action,,,,Menu Tools | show preferences & show proxy servers"
--------------------2
item, "从地址栏复制代理"="external action,,,Add Proxy,Add widget | focus address field & select all & copy & cancel & go to page, "opera:config#proxy|httpserver" & delay, 1000 & select all & paste & focus next widget & focus next widget & paste & focus address field & insert, "opera:config#proxy" & go & focus previous widget & focus previous widget & click button & delay, 10 & ok & delay,1 & close page"
item, "从剪切板复制代理"="external action,,,,Add widget | go to page, "opera:config#proxy|httpserver" & delay, 1000 & select all & paste & focus next widget & focus next widget & paste & focus address field & insert, "opera:config#proxy" & go & focus previous widget & focus previous widget & click button & delay, 10 & ok & delay,1 &close page"
--------------------3
item, "添加例外"="external action,,,,Transfer Success | edit site preferences & delay, 10 & copy & cancel & delay,1 & disable proxy servers & show preferences & show proxy servers & delay, 10 & check item & focus next widget & focus next widget & focus next widget & check item & focus next widget & focus next widget & focus next widget & focus next widget & focus next widget & focus next widget & focus next widget & focus next widget & check item & focus next widget & go to end & insert,"," & paste & ok & delay,10 & cancel"
--------------------4
item, "127.0.0.1:8580"="external action,,,,Extended Security | disable proxy servers & show preferences & show proxy servers & check item & focus next widget & insert,"127.0.0.1" & focus next widget & insert,"8580" & focus next widget & check item & focus next widget & insert,"127.0.0.1" & focus next widget & insert,"8580" & ok & delay,10 & cancel"
item, "127.0.0.1:8000"="external action,,,,Extended Security | disable proxy servers & show preferences & show proxy servers & check item & focus next widget & insert,"127.0.0.1" & focus next widget & insert,"8000" & focus next widget & check item & focus next widget & insert,"127.0.0.1" & focus next widget & insert,"8000" & ok & delay,10 & cancel"
item, "127.0.0.1:8081"="external action,,,,Extended Security | disable proxy servers & show preferences & show proxy servers & check item & focus next widget & insert,"127.0.0.1" & focus next widget & insert,"8081" & focus next widget & check item & focus next widget & insert,"127.0.0.1" & focus next widget & insert,"8580" & ok & delay,10 & cancel"
item, "127.0.0.1:4041"="external action,,,,Extended Security | disable proxy servers & show preferences & show proxy servers & check item & focus next widget & insert,"127.0.0.1" & focus next widget & insert,"4041" & focus next widget & check item & focus next widget & insert,"127.0.0.1" & focus next widget & insert,"4041" & ok & delay,10 & cancel"
--------------------5
item, "运行 FreeGate"="external action,,,,Mail Attachments | execute program,"notepad.exe""
item, "     退出 FreeGate"="execute program,"cmd.exe","/c taskkill /im fg*""
item, "运行 GAppProxy"="external action,,,,Mail Attachments | execute program,"notepad.exe""
item, "     退出 GappProxy"="execute program,"cmd.exe","/c taskkill /im gui.exe /f /t || taskkill /im proxy.exe /f || taskkill proxy.py /f""
item, "运行 Tor"="external action,,,,Mail Attachments | execute program,"notepad.exe""
item, "     退出 Tor"="execute program,"cmd.exe","/c taskkill /im tor.exe"

如果你不嫌麻烦,还可以把这个按钮做得更强大一点,点击左边可以控制全局代理的开关,点击右边的三角形就打开代理菜单。但麻烦之处就在于因为使用了很多个“&”运算符,Opera无法判断当前的状态,所以就不能根据使用代理的情况给出正确的图标,不过,我还是找到了一个解决的办法。按钮如下:Proxy Menu Pro

opera:/button/disable proxy servers, , , "proxy menu pro", "check skin" | enable proxy servers & show preferences & show proxy servers & focus previous widget & focus previous widget & focus previous widget & focus previous widget & focus previous widget & uncheck item & ok & delay, 10 & cancel + show popup menu, "proxy menu pro"

screen你还需要对皮肤文件做一下小小的修改,点击这里查看当前使用的皮肤文件的位置,关闭Opera,打开皮肤压缩包,把里面的skin.ini拖出来,用文本编辑器打开,在最后加上下面的几行语句,保存后再拖回压缩包里,然后再打开Opera,把上面的按钮拖放到Opera的工具栏中。

[Check Skin]
Type =
Box
Tile Center = checkbox/selected.png
Width = 16
Height = 14

[Check Skin.selected]
Type = Box
Tile Center = checkbox/unselected.png
Width = 16
Height = 14

最后的效果如上图