今天看到 Twitter 上有人讨论浏览器发送 HTTP_REFERRER header 导致民间 Twitter Web 客户端地址被泄露的问题。研究了一下,这个问题的最终解决都需要依靠浏览器,网站自己没有办法强制禁止浏览器发送 HTTP_REFERRER header。

Chrome/Chromium

Chrome/Chromium 的 WebKit 内核最新版支持 HTML5 里的 noreferrer link relation。这个功能允许网页作者在 a 和 area 元素里简单地使用值为 noreferrer 的 rel 属性来禁止浏览器向链接目标发送 HTTP_REFERRER header。例如:

<a href="http://evil.com" rel="noreferrer">Evil</a>

当用户点击这个链接访问 evil.com 时,对方只会收到一个空白的 HTTP_REFERRER header。在 Windows 版的 Chrome 4.0.295.0 dev 上测试通过。

Firefox

Firefox 的扩展 Adaptive Referer Remover 可以禁止指定的 URL 出现在 HTTP_REFERRER header 里。它使用正则表达式来匹配要保护的 URL。普通的 URL 转换成它需要的正则表达式很简单,只需要在前面加 ^ 并把 . 改成 . 即可。例如:

^http://rainux.org
^http://search\.twitter\.com

另一个更简单但比较极端的做法是在 about:config 里将 network.http.sendRefererHeader 设置为 0,这样会完全禁止 Firefox 向任何网站发送 HTTP_REFERRER header。

Opera

Tools-> Preferences-> Advanced-> Network-> Send referrer information 去掉勾选。(感谢 vvoody 补充)

Internet Explorer

别开玩笑了,IE 的漏洞都导致 Google 重要服务被攻破 而被迫退出中国了,你还敢用它?

标签:

IE 里有很多原生的 Javascript 函数实际上都不是一个标准的 Function 对象,例如 window.alert,window.setTimeout 以及 IE8 的 window.console.log 等。在需要对这样的函数进行包装的时候,会因为它们都没有 Function 对象应该有的 .apply() 及 .call() 方法而难以做到。

这段代码为了兼容旧版本没有 console 的浏览器,尝试将 console.log 包装为 $.log,但是基于上述原因它在 IE 里无法执行。

$ = {};

if (console && console.log) {
    $.log = function() {
        console.log.apply(console, arguments);
    };
} else {
    $.log = function() {};
}

由于 window 和 console 这样的原生对象都是只读的,所以无法使用类似这样的代码简单地为其添加 .apply() 方法。

console.log.apply = Function.apply;

解决办法是使用 Function.apply.apply() 将 Function.apply 函数对象 apply 到 console.log 上。

$ = {};

if (console && console.log) {
    $.log = function() {
        Function.apply.apply(console.log, [console, arguments]);
    };
} else {
    $.log = function() {};
}

这段代码和第一段代码完全等价。

如果觉得不容易理解,可以看看这个 .apply() 函数比较清晰的例子。这两行代码也完全等价。

[1, 2, 3, 4].slice(0, 2);
Array.prototype.slice.apply([1, 2, 3, 4], [0, 2]);
标签:

Ruby 1.8.7Rails 2.1.0 前两天相继发布。Firefox 3.0 昨天进入 rc2 阶段,并且将在六月中旬发布 3.0 正式版。开发了十五年的 Wine 终于进入 1.0 的 rc 阶段,并且即将发布 1.0 正式版。

看来是时候更新 SCV Selector 了,可惜预想了很久的 rep 版本识别还是没有时间去研究……

标签:,

delynn 老兄终于发布了他的 Rails CHM Documentation 的 2.0.2 版,再也不用忍受 RailsBrain.com 那个 Rails API with the AJAX flavor 糟糕的目录结构了。

网上流传的所有 Rails 文档都是用 rdoc 从 Rails 源代码里的 RDoc 注释自动生成的,内容都完全一样。但只有这位 delynn 老兄的 Rails CHM Documentation 目录是手工整理的,按照 Module 分类,结构非常清晰。

标签:

第一次做网站

March 25th, 2005

朋友的公司做的网站刚刚完工,心中窃喜不已。

接触 HTML 已经是很久以前的事了,却从来不曾做过比一张极其简单的网页更多的东西。听说 CSS 也是在很久以前了,但是在架设/维护我的这个 Blog 之前,对 CSS 的认识也没有超过“能够设置固定大小的漂亮的 9pt 字”这个范围。一直以为自己没有真正的学过 HTML,一直不敢在 Dreamweaver 里闲逛,总觉得他们都是那么深奥和高不可攀。

在答应朋友“只是修改一下页面,添加一些内容”的要求后,我都一直心里没底,不敢随便承诺完工时间。用 DW 看了一番他的网站以前的页面代码,发现这些用表格布局的页面代码糟糕透了。再加上页面设计也不符合我的审美观,如果要改可能要花费很多时间而且还会搞得心情不好 (代码实在太乱) ,想了半天还是决定仿照现有的布局用 DIV + CSS 完全重新做一个。 Read the rest of this entry »

标签:,