包含关键字 bug 的文章

前言

无意翻到 Let's Encrypt (下称 LE )已支持 OCSP Must-Staple 扩展的消息
再加上之前也想升级双证书
于是又有了重新折腾一次的动力。
记录如下——

特别提示:
如果仅是希望使现有证书支持 OCSP Must-Staple ,
用原私钥重新生成 CSR 申请证书即可。
详见 CSR 一节。

准备

服务器环境

推荐使用 nginx-autoinstall 脚本进行安装,
原 Repo 仅适用于 Debian 8
其它发行版需要稍作修改。

编译并安装完可以使用如下工具测试相关特性:

工具选择

CA 当然选择免费且开源的 LE
工具方面则依旧选用 ACME-Tiny
官方列表中亦罗列不少,
包括最近很流行的国人作品 ACME.sh
若选用其它工具则签发流程会有所变化(相应环节会稍作说明)。

密钥强度及算法选择

RFC5480 ,对 ECDSA 证书的推荐组合如下:













- 阅读剩余部分 -

介绍

多年前写过一个 Firefox 扩展和一个油猴脚本
都是用来简化在浏览器上对“特殊链”的处理。
这么多年过去,
浏览器早已放弃 Firefox 改用 Chrome ,
“下载器”也从离线迅雷换到了 115 云
那么工具也该更新更新了。

之前的油猴脚本仍能够“部分”工作——
magnet: 之外的其它“特殊链”伪协议均不能注册到 Chrome 中。
于是抽空写了另一个脚本,
功能如下:

取名为 Specilink Remastered
是为了纪念之前的那个 Firefox 扩展。

配置项

脚本本身支持的配置项如下,
请打开脚本管理器在源码中编辑:

var Configs = {
    'enabled_handler'       : 'thunder', // “下载器”可选项:115, thunder, qq, miwifi
    'auto_add_task'         : true,      // 是否自动添加下载任务,否则需要你手动点击按钮
    'auto_add_task_timeout' : 10000,     // 自动下载的监听时间,单位毫秒
    'register_protocols'    : false,     // 是否注册为浏览器内置 Handler
    'debug_mode'            : false,     // 是否开启调试模式
};










- 阅读剩余部分 -

2012.09.04 更新

Firefox 终于追随 Opera 和 Chrome 之后实现了 Click to Play 的功能,
启用方法是在 about:config 中将 plugins.click_to_play 设置为 true

前几天我在评论里回答 echo·falsita 朋友时说:

“原生的 Click to Play 还无法很好的管理白名单”

在这里我表示抱歉(见下图)。

The 'Click to Play' Feature in Firefox

看来本工具“阳寿已尽”,多少有点儿伤感……


- 阅读剩余部分 -

最近从用户那里收到反馈说访问产品出现“白屏”,
由于版本上线前都必须在众多不同环境下通过测试,
于是猜想这个问题的出现与用户的浏览器设置有关;
进而联系用户来模拟其使用环境加以调试,
终于定位并解决了这个“非主流” Bug ,
记录如下以供各位参考。

这里先描述一下重现场景
必须同时满足如下所有条件:

  • IE 6;
  • 启用了“代理自动配置 PAC “;
  • 页面内容非空且使用 http 协议访问;
  • 页面引用了一个未经缓存的外部脚本;
  • 该脚本问了 location 对象;

该场景下访问页面会得到 Access Denied 错误(捕获错误后如下图),
出错位置正是访问 location 对象的那一句。

访问 location 对象时报错

测试环境只对 IE 6 启用了 PAC 而已,
其它设置均保持默认值,
所以除了说服用户升级浏览器或放弃使用 PAC 之外,
我们只能想办法去规避这个问题。<!--more-->

幸亏 document 对象下还挂着个 URL 属性,
它指向文档的实际地址,
且在绝大部分情况下等同于 location.href
因此我们只需要用正则利用 DOM 对象去分解它即可,
例如:

document.URL.match(/^([^:]+):\/\/(?:([^:@]+):?([^@]*)@)?(?:([^/?#:]+):?(\d*))([^?#]*)(?:\?([^#]+))?(?:#(.+))?$/);

当然,定位问题的过程不复杂却很繁琐:
首先当然是去微软知识库搜索,
找到两个可能相关的:KB 908356KB 884430
提到了安全区域设置,

于是怀疑与 PAC 文件所使用的协议或域名有关——
PAC 、外链脚本和文档统一为同域,报错;
改用 file: 协议来访问 PAC 文件,果然正常了;
将外链脚本改为内联书写,也正常

既然只在脚本外链时才出现,
想试试是否跟文档状态和写法有关呢?
调整外链脚本的加载和访问 location 对象的时机
(head/body/异步/domReady/load/延时等……),仍旧报错;

我也曾怀疑是否和 PAC 的写法有关,
突发奇想将 PAC 文件内容清空,结果<span style="color: #008000;">世界清静了</span>;
但只要加上一个字节,
(哪怕没有 PAC 所需的 FindProxyForURL() 函数定义)
你终归是无权访问 location 对象的。

不止是原生 IE 6 ,
IETester 内置的 IE 6 引擎也可以重现问题,
但 5.5 反而不会(抱歉并未用原生 5.5 测试);

最后,虽然重现条件看似很苛刻,
但只要用户使用 IE6 并配置了 PAC
(反馈该问题的用户浏览器便被某播客加速软件自动启用了 PAC 文件),
要想满足“外链文件未缓存”和“访问 location 对象”这两个条件还是挺容易的。
所以如果你的产品功能需要从文档 URL 取信息,
那么可以考虑予以改进。

P.S.
由于 Fiddler 的原理是接管浏览器代理,
所以如需抓包调试,
要么将 127.0.0.1:8888 写入 PAC 文件,
要么使用网卡抓包工具等其它方案。

如果找到相关资料欢迎留言告知,
这里为懒人们提供一个最简的测试用例








































- 阅读剩余部分 -

【2010.12.08 更新】
抱歉,
用原生 IE9 测试后发现 IE9 的判断代码已失效,
研究将继续……

【2010.11.29 更新】
之前的 IE8 检测方式容易被“伪造”,
改为检查 Image 对象是否存在 prototype 的方式。(via)
另外有朋友说 IE8 的探测在 IE7 模式下也通过,
我想说这是我有意为之:
目的就是要探测浏览器本身的真实版本,
具体运行于哪种模式可以通过 doc.documentMode 来获得。

【2010.11.17 更新】
IE9 不知从哪个 Pre 版开始,
又恢复了之前更新时所提到的
非空数组字面量的最后一个元素缺失的问题,
也就是说这个 Bug 又得以“重现”了。
我个人推断是太多线上应用依靠这个 Bug 来识别 IE ,
因此开发团队不得已而为之。
但不管怎样,
本文还得继续。
目前利用了 IE9- 里 toFixed 方法在特定情况不会四舍五入的 Bug 来判定,
具体代码请见正文。

【2010.08.13 更新】
增强了 IE6 的区分能力。
当然更可以使用 IE 自己的条件编译,
只是有的压缩器支持度有限,
不便于日常开发。

【2010.04.18 更新】
更加严格地区分出了 IE 9,
增强了 Opera 的区分能力,
并将 Chrome 的判别特征换成了引擎特性 [via],
这样你就能看出国内哪些浏览器是从 Chrome 的内核改过来的了,
大家可以动手试试。 :)

【2010.04.17 更新】
IE 9 在我看来改进非常大:
有我所关心的对 Mutation Events 的支持,
还有事件模型的 W3C 化等等……
本文中我就不多冗述,
有机会再另文探讨。
由于在项目中大量使用特征判断,
IE 9 在这方面最显著的变化是:
之前那则“最短的 IE 判断法”已经失效,
一起被修复的还有一直伴随 IE 的数组 Bug:
非空数组字面量的最后一个元素缺失的问题(即:[null,]),
因此现如今的最短记录保持者(6字节的 !-[1,])也已然失效。(而且不支持 CC 压缩)
你也不要尝试使用 addEventListener 方法来判别,
因为 IE 9 已经支持了。(事件的改进非常大,这很好)
所以说 IE 已经越来越靠近标准,
如果在项目中有对 IE 进行特殊处理的代码,
你可能需要在 IE9下重新检查一下了。

由于我个人依旧是 XP 的忠实拥趸,
而 XP 又很悲剧地无法安装 IE 9,
所以一些测试是在 Haitao Jia 同学的协助下完成,
在此表示感谢。
也正因为如此,
我没有进行覆盖面太广的测试。
不过目前所发现的唯一“幸存”下来的 IE 系列 Bug 依旧与刚提到的数组 Bug 有关,
微软修复了字面量里的 Bug 却忘了当字符串被 split 成数组后却涛声依旧啊。
虽然判断起来稍微麻烦了点,
但不管怎样这是我目前发现的仅剩不多地可以用来判断 IE 全系列的代码:

- 阅读剩余部分 -