Category Archives

17 Articles

迁移 WordPress 博客至 HTTPS

新年的第一篇博客,感谢正在阅读的你。新年快乐!新年新气象,由于种种原因,我最后下定决心把博客整体迁移到 HTTPS 。简单记录一下过程。

申请的是 StartSSL 的免费版证书。体验很一般。整个网站响应缓慢,界面一股十年前的风格,还动不动丢失 session 必须重新来过,周末晚上也不提供服务。一开始使用了宿舍地址,被拒绝;人工沟通后被告知要使用个人的永久地址,折腾了好几次才办下来。不过也因此确定了一件事情:整个验证服务很多关键点上都是客服人工操作,直接回复发验证码过来的那个邮箱竟然在很短时间内就收到了客服的答复(赞一下效率)。不过还是觉得,有些地方明显是可以程序自动化的,期待今年夏季要上线的 Let’s Encrypt 。另外,鉴于 StartSSL 的用户体验,愿意掏一点点钱的话,可以去 namecheap 买最便宜的那个证书,一年也只要10刀,省心不少。

部署的话网上有很多文档了。首先(或者说,应该在申请证书的时候)应该自己先搞清楚一些公私钥体系的基本概念:根证书、 CA 、服务器证书、服务器私钥这些是什么东西。简单来说 HTTPS 的核心是一个公私钥加密系统,私钥必须保密存放在服务器上,公钥(证书)会被服务器传送给客户端使用。为了确保这一对密钥真的属于这个服务器,还构建了一套信用体系:浏览器内置了若干 Root CA ,这些 CA 可以信任(签署)其他下级 CA 或者是某个服务器证书。浏览器拿到服务器发来的证书时就会检查这个信任链。如果任何一环的签署有问题(甚至干脆就是自己给自己签发的),就会变成“不可信证书”。

Read More

About Shadowsocks

我用 shadowsocks 很长时间了,最开始是从 V2EX 的这个帖子开始:发一个自用了一年多的翻墙工具 shadowsocks 。还记得那个时候这个小工具还只是一个900行左右的自用脚本,现在已经发展成功能齐备、拥有多种语言和平台 port 的社区项目、大家族了。虽然我认为它的发展在某种意义上偏离了一开始的理念——简单的架构,任何程序员都可以自己修改协议和加密部分,从而使得拦截变得困难——现在的 shadowsocks 毫无疑问已经形成了自己的一套协议,若要享受数量庞大的 ports ,自行修改协议变得不切实际了起来;然而更加丰富的功能、更稳定的程序、更快的速度也的确是为更广泛的群体提供了一个非常方便的工具。今天就简单说一下这么长时间以来的一些使用经验,以及其他一些废话。

Read More

Content Security Policy 导致 bookmarklet 失效

近来发现在知乎、 Github 上我最常用的 bookmarklet (书签小工具,就是那种一句话 Javascript 书签)——饭否分享失效了。打开 Console 一看,有这样的提示:“Content Security Policy: 页面设置阻止读取一项资源:已经阻止执行内联脚本。”大概是孤陋寡闻,之前还没听说过 Content Security Policy 这玩意儿,猜测又是和 Cross-Origin Resource Sharing 有关系的什么东西,就做了一番搜索。

CSP 是一个可以限制页面中哪些 src (包括脚本、图片等等)可以被允许的实验性 HTTP Header 。这是 W3C Candidate Recommendation ,而这个是 MDN 上的相关资料。简而言之又是一个 defend by depth 的产物,可以给 XSS 防范再加上一层保险:直接禁止掉 inline script 和 inline eval ,然后给出一个允许加载的资源域的白名单,这样即使有 XSS 过滤漏洞,也无法注入站外的脚本。

但是问题就来了:用户直接在地址栏里输入的 Javascript 应该被允许么? Bookmarklet 应该被允许么? W3 文档这么说:

Enforcing a CSP policy should not interfere with the operation of user-supplied scripts such as third-party user-agent add-ons and JavaScript bookmarklets.

可事实是 Firefox ( Chrome 估计也是)没有正确实现,把 bookmarklet 也给拦截了,同时拦截掉了的还有 Lastpass 这样的插件的 JS 脚本,这也顺便解释了为什么 Lastpass 在知乎首页上无法自动填充的问题。

Github 博客上介绍这个新措施的文章里也提到了这个问题,并且给出了一个“解决方案”——直接把浏览器的 CSP 支持给禁用就好了……

禁用版本检查以加快 phpMyAdmin 的页面载入

phpMyAdmin 在更新到 4.x 之后就开始出现奇怪的访问缓慢问题,在 localhost 上遇到过(使用到是 Archlinux 打的包),在服务器上也遇到过(使用的是自己从官网下的压缩包)。有时出现有时又不出现。之前一直觉得是 phpMyAdmin 中 row count 之类功能的设置问题,但调了很久也没解决。主要是问题飘忽不定,急着用的时候碰到了也没空去查,想查的时候又不出现。昨天猛然想到开了个 Firebug 看网络请求,结果一下就发现了问题所在——是被 version_check.php 这个页面请求卡住了……这下才恍然大悟,大概是 4.x 中加入了版本检查功能,可是服务器不一定能够连接外网(比如本机断网或者在内网服务器上),所以就必须等到连接超时……

解决方法很简单,在 config.inc.php 中加入这一行:

$cfg['VersionCheck'] = false;

也谈近期的“免费大容量云空间”大战

中国的互联网产业是越来越疯狂了。

网盘是一个相当传统的产品了。国内早就经历过一轮网盘潮流——即115、永硕、dbank(后来明白是华为产品)等等风靡大陆的年代。那时候网民们疯狂地寻找更快、更大、支持外链的免费网盘,各种产品也是一个接一个出现,其中不少有地方运营商背景。因此也产生了不少恶性竞争——容量越标越大,审核越来越宽,盗版、色情等等违法内容泛滥,但这些内容却也是网盘吸引流量的最大法宝。然而玩火终自焚,一个又一个的网盘因为资金不济或政策、法律压力而被迫关闭——有的直接消失,有的禁止了外链。红极一时的115停止外链即是此轮风潮的一个休止符。

Read More

正确处理下载文件时HTTP头的编码问题(Content-Disposition)

最近在做项目时遇到了一个 case :需要实现一个强制下载功能(即强制弹出下载对话框,阻止浏览器尝试解析显示某些文件格式),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符)。

前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可以配合 Content-Type: application/octet-stream 来确保万无一失。而后一个需求就比较蛋疼了,牵扯到 Header 的编码问题(文件名是作为 filename 参数放在 Content-Disposition 里面的)。众所周知, HTTP Header 中的 Content-Type 可以指定内容(body)的编码,可 Header 本身的编码又该如何制定?甚至, Header 究竟是否允许非 ASCII 编码呢?

如果放任编码问题不管,那么你一定会遇到在某个系统及浏览器下下载文件时文件名乱码的情况;如果你尝试搜索解决,那么你很可能会找到一堆自相矛盾的解决方案(我可以负责任地告诉你,其中的99%都是不符合标准的 trick 罢了)。让我们来看看到底应该如何优雅完美地解决这个问题吧!

Read More

推荐 WordPress 反垃圾评论插件 NoSpamNX —— 远离验证码!

自己搭建过独立 WordPress 博客的都应该体验过这种情形——正当你为博客被大型搜索引擎收录而高兴之时,麻烦也随之而来,垃圾评论铺天盖地,就算开启了 WordPress 自带的 Akismet 反垃圾插件也只是减少了一些数量,无法彻底阻挡。因此 WordPress 官网上各种反垃圾插件也颇受欢迎。总的说来大致分两种——一种是需要用户交互的,比如各类验证码、验证问答等等;另一种是所谓的“自动”反垃圾,不需要用户参与。这里我将给大家推荐一种优秀的非用户参与式反垃圾插件, NoSpamNX 。

Read More

在博客里启用社会化分享按钮

最近突然想起来,我的博客居然一直都没有放置社会化分享按钮,很不合社交网络化和网络社交化的潮流。于是决定在博客文章下方放置分享链接。本以为是个容易的事儿,去各个社交网站找一下分享按钮的代码放上去就是了,就像上次做那个快捷订阅侧边栏一样。可实际做起来才发现不是那么容易——社交网站实在是太多了!一个个手工去找实在麻烦。就想去弄一个插件来解决。

Read More

在博客上放置饭否状态模块

最近饭否用的越来越频繁,逐渐融入到饭否圈子里了。相比Twitter、人人,饭否成为我真正意义上的“微博”。于是就打算着把饭否放到我的博客上。首先想到的自然是和Twitter类似,找一个plugin装上就是了。可是去搜了一下发现只有一款很久未更新的fanfou-tools(上次更新是在饭否宕掉前,现在API都变了),只好作罢。

后来又想直接在首页上放一个RSS模块,订阅我的饭否timeline的RSS。这确实可行,而且也在我的博客上呆了10分钟。可是我突然想到——这RSS模块输出的是HTML代码,而我的饭否timeline更新极频繁,这样在我博客的缓存机制下,首页的RSS信息就严重滞后了……

这时在饭否首页右下角瞟到了 » 试试饭否插件 这个东西,果断点进去,(BSP页面随便选一个,比如blogger),发现了一段JS代码……这下解决了,直接贴进WP的文本widget里了事~

P.S. 代码里有一个count是定义显示数量的,可以自行修改。