善意提醒

如果您打开本站很慢,布局排版混乱,并且看不到图片,那么可能是因为您还没有掌握用科学的方法上网的本领。

2014-10-31

SingleThread下遇到的并发问题

手下某个小弟,有一天报告我说他写的某个Win32 Application有一个奇怪的Bug,搞了半天搞不定,向我寻求支援。Bug现象是:下载文件,完毕弹框提示,点掉之后报错,Crash。

通常而言,这种问题,往往是因为在释放、删除什么东西的时候,该做的事情没做对,比如对着一个对象的指针进行了重复delete之类。但看了下代码,没觉得这方面有什么问题。因为这是个SingleThread的程序,于是尝试用单步跟踪跟了一下,发现有一段代码似乎在所属对象析构之后还在跑。这就有点奇怪了:SingleThread的Application,不应该有这种属于MultiThread的毛病才对。Socket模型用的是AsyncSelect,也就是说「异步」是用Windows消息做出来的,并不是真的「并发」。那么到底是哪里不对劲呢?

再接下来分析发现,虽然是SingleThread,但最后出错前弹的那个提示框,是在OnReceive的时候通过SendMessage去弹的。这样就有眉目了:ModalDialog并不阻塞ParentWindow的消息循环,所以在弹框等待用户确认的时候,消息循环收到了OnClose,于是Socket对象在用户点击确认按钮之前,其实已经被Destroy了。之前还没跑完的OnReceive,接着再跑的话,当然只能Crash了。

分析到这里,问题就已经很明白了:这就跟MultiThread下临界区没加锁一样嘛。你以为SingleThread下每个函数就都是原子操作,不会被乱入的东西打搅?呵呵,你一DoModal就会给你再嵌个消息循环进去的。可怜很多小弟连DoModel的原理都没搞懂就开始写程序了。我上次还听几个小弟在争论相关问题呢。不是说写程序必须啥都弄明白才能开始,但若是只拎半壶水就开跑,将来就难免会碰上这种「奇怪」的问题。

要修正这个问题,也很简单,改成用PostMessage让MainWindow自己去处理弹框的事情就可以了。不过有点奇怪的是,在XP下好像不会看到错误现象。Win7下直接运行EXE也不报错。只有通过两层以上的CreateProcess去调用,才会看到现象。难怪没什么用户报告这个问题。是不是OS觉得这个EXE反正会很快地Over掉,有些错误就不报算了?看来微软在私底下还是有一些没告诉大家的小动作的哈哈。

总结一下,这个案例教育我们:
  1. 不要以为只要是SingleThread就一定不会遇到并发问题。
  2. 前/后台逻辑应该要区分清晰,是后台代码就别抢前台的活儿。
  3. 还有,SendMessage/PostMessage不要不经大脑就乱用。

2014-07-31

Alipaybsm.exe是个有意思的东西

在接下来的篇幅中,我要讲一个目前还没结束的故事。故事可能还会继续发展下去,也可能因为我的懒而就此打住。但至少我觉得目前已经有足够有意思的信息可以让诸位知道了。这件事,跟支付宝有关,跟(网络)信息安全也可能有一些关系。有兴趣的朋友,可以接着看下去。


我以前曾写过一个服务器Ping值测试程序(参见这里《写了个批量测试服务器Ping值的小工具》)。这个程序一直都能满足我的需要,直到有一天在我老婆的笔记本Win7 x64系统上遇到了问题:对几乎所有的IP,我这个程序的Ping都很快收到了回应,快得不正常,几乎就像做了个本地调用一样,与实际情况不相符。于是我打算看看这是怎么回事情。

当时我人在公司,VC6远程调试又不方便。最后靠着DbgView终于搞清楚了:接收到的数据中,多出来了一份不正常的东西。我之前的代码,并没有估计到这份不正常的数据可能会出现,所以处理上出了些问题。

OK,这算是我的Bug。可这「不正常的数据」到底是什么东西?我把它Dump出来一看,还真是有点奇怪!ICMP Type是8,源地址和目的地址则与预期的Echo回应包刚好相反。算上sendto时候系统自己加上的IP包的包头,跟我送去发送缓冲区里的数据那是一模一样。

要解决我程序里的这个问题非常简单。但是另一个问题就不那么好回答了:为什么其它电脑上不会这样,偏偏这台电脑会出现这种奇怪的事情?
直接答案很简单——它一定跟别的电脑有什么地方不一样!
那么还有第二个问题:到底是什么地方不一样呢?

可以说是我的幸运,也可以说是阿里集团的不幸。因为我的Taskmgr里面进程列表设置为按ASCII字母序排升序的缘故,我很快就找到了这第二个问题的答案:Alipaybsm.exe。杀掉Alipaybsm.exe这个进程,前面提到的那份「不正常的数据」就不再出现。而这个Alipaybsm.exe似乎由AlipaySecSvc.exe在守护,过了一会儿就又自己启动起来了。它一出现在进程列表中,我一试,哈,那个奇怪的现象就又出现了。

后来,我把这事情在Twitter上说了一下,还引发了一场小小的讨论。
我目前还没完全想明白Alipaybsm.exe这样做的目的是什么。初步感觉,有可能是跟背地里监控网络流量有关。毕竟,目的地址不正确的数据,就算被放入Socket接收缓冲里面,在网络层与传输层之间估计也被滤掉了。我这次是因为用了SOCK_RAW,需要自己下到网络(IP)层来处理数据,才碰巧发现了这个情况。如果只是在传输层(TCP/UDP)从事工作,估计不会有任何察觉。
只不过,反过来讲,如果能做到复制数据到Socket接收缓冲,那应该完全可以做到监控流量而不带任何痕迹才对。所以我目前还只能理解为,Alipaybsm.exe想完全监控网络流量,所以利用了这个手段(复制发送的数据到接收缓冲中),但干这事屁股没擦干净(也可能没法擦干净),才产生了我遇到的这些情况。

我本来以为当时那个Alipaybsm.exe是个假货。但看EXE的详细信息,以及绑定的数字证书,都像是支付宝官方的真货。我又以为那只是一个不成熟的版本,可能有Bug,但我前两天为了转一笔账,又去下载并安装了一个支付宝安全控件,然后它又出现了,带着它那奇怪的行为又出现了。
所以,我们来仔细看看这货吧:

看上去挺正常吧?

在Twitter上讨论的时候,有人表示,在Mac上用防火墙没观察到有这个现象。为此,我今天特意去确认了一下:在Windows上抓包,也观察不到这个现象。我估计,只有自己写基于SOCK_RAW的程序,才能收到这些数据。为了检查这种特殊的行为,我专门写了个小程序AlipaybsmTester,基本上就是一个单地址单次单线程的PingTester。

从这幅截图中可以看到,Microsoft Network Monitor只抓到了一来一回共两个包,但我的测试程序发了一个包收到了两个,内容各不相同。如果杀掉Alipaybsm.exe,那就只会收到后一个包了。

接下来再看看这个Alipaybsm.exe的一些更好玩的事情:
很奇怪的是,它其实并不是随着「支付宝安全控件」(Aliedit.exe)装上去的。当你登录支付宝,根据Web页面上的提示安装了「支付宝安全控件」时,只会在Program Files (x86)\alipay下面建一个名字叫alieditplus的目录。

但是过一会儿(我这次过了30分钟左右),在alieditplus下面会出现一个update目录,并下载一个SafeTransaction_Setup.exe放在其「\job\file\tmp\zip_1009_」子目录中(不同时期不同环境中路径可能会有所不同)。随后Program Files (x86)\alipay\SafeTransaction目录便出现,里面就有Alipaybsm.exe(当然还有一些别的)。

我在网上想搜一下关于这个Alipaybsm.exe或SafeTransaction_Setup.exe的相关信息,发现少得可怜。有一篇「百度知道」的问题在问为什么Alipaybsm.exe可以提升网速。我估计提问者是从迅雷或360流量监控浮窗上观察到了这种现象吧?其实这就是Alipaybsm.exe在偷偷复制数据包到接收缓冲中的结果。那些在接收缓冲中突然多出来的数据,在第三方看来就是网速翻倍了。

Alipay官方则完全没有提到过这些东西,好像它们是感染了AIDS的私生子一样。不过每个安装了支付宝安全控件的电脑上,估计都会有这些个东西(还有个AlipayDHC也值得注意)。我认为以这种方式进行推广的程序,很可能另有其目的,不见得真的是保障个浏览器安全这么简单。如果真是为了保障浏览器安全,完全可以公开(乃至大张旗鼓地)宣传,然后打包到安装包里一起分发下去正大光明地安装,不是吗?

PS: 我后来发现,杀掉AlipaySecSvc.exe也会导致复制数据包的现象中断,并且重启该服务之后,恢复现象花的时间比单单杀掉Alipaybsm.exe要长。可见Alipaybsm.exe的角色大概只是一个行动的发起者和结果的分析者,具体对流量实施监控的行为,很可能是它去调用AlipaySecSvc.exe中的某些个服务来完成的。这说明对于「支付宝安全控件」本身也不能掉以轻心。相关功能其实可能一直就放在AlipaySecSvc.exe中,只是没有人来扣扳机而已。而这个扣扳机的可以是Alipaybsm.exe,也可以是别的谁,那谁谁谁。

2014-05-07

BCB5在Win7 x64上启动时报错「1 transfer item(s) contain syntax errors」

由于WinXP已经被微软官方宣告服务终止,最近把工作环境升级到了Win7,并且安装的是x64版本。装了之后发现,BCB5启动的时候会弹出一个报错对话框,里面的信息很奇怪:
1 transfer item(s) contain syntax errors
点「确定」关闭对话框之后,BCB5使用起来也没有什么问题。但每次启动都会弹框,很讨厌。那么,这是什么情况呢?

一般来讲,Win7与WinXP之间,出现类似兼容性问题的原因大致有:

  • 管理员权限问题
  • 注册表键值问题
  • 系统目录问题
  • DEP问题

在x64系统上,目录问题尤其突出。Program Files现在还有个Program Files (x86)。System32那边也有个SysWOW64。后者一般跟应用软件关系还不太大,但前者常常会导致很多问题。我就见过有的软件安装包都会运行出现问题。

这次的情况其实也类似。照例,先上国外网站的链接。
http://codeverge.com/embarcadero.cppbuilder.install/at-start-up-1-transfer-item-s/1096695
最后那个回复,把操作步骤写得很详尽。做C/C++开发的,英语阅读一般还是不会有问题,我就不翻译了。

总之呢,这个问题就是因为Program Files (x86)直接引起的。另一个回复里面说把BCB5卸载后重新安装在Program Files下也能解决。当然,有问题的地方其实只有一处,所以完全没必要如此大动干戈。

2014-03-20

为什么不用动态内存分配?

在写这篇Blog的时候,我考虑了几分钟,在想要不要把标题写成《为什么有的程序员喜欢用动态内存分配?》。最后我还是把那些修饰词和定语给删了。虽然那个标题更准确一点,但是本文基本上是一篇吐槽文,我还是比较喜欢这种反问句的感觉。

事情是这样开始的:
在工作中,遇到了别的同事以前写的一段代码。作用是显示从某些网上下载的文件的内容。文件下载完后,也在本地保存了一份副本,这样如果下次发现本地有副本,就直接显示不用下载了。
这基本上是一个类似浏览器缓存的功能,实现起来也不难。不过这次我碰到一个Bug,有个文件的副本,在解析的时候报错了。
因为第一次下载的时候并没有报错,所以焦点就集中到这个缓存机制上。这里面有个值得关注的地方在于,大概是出于节省本地硬盘空间的考虑,本地的副本在保存时是压缩过的。于是问题可能出在两个地方:

  • 压缩算法有问题,压缩保存的时候,把文件给弄坏了。
  • 解压缩算法有问题,无法正确还原这个文件。

这套压缩/解压缩的算法,是开源的(zlib)。所以我认为问题不应该出在算法本身,更可能是用法没用对。调用代码大概是这个样子的:
#define chunk 16384
void compress_file(const char* source_file , const char* dest_file)
{
    unsigned char datein[chunk];
    unsigned char dateout[chunk];
    unsigned long datelong = chunk;
    unsigned long sourcelong;
    FILE* source;
    FILE* dest;
    source = fopen(source_file , "r");
    dest = fopen(dest_file, "w+b");
    while (!feof(source))
    {
        sourcelong = fread(datein, 1, chunk, source);
        compress(dateout, &datelong, datein, sourcelong, 1);
        fwrite(dateout, datelong, 1, dest);
    }
    fclose(source);
    fclose(dest);
}
void un_compress_file(const char* source_file , const char* dest_file)
{
    unsigned char datein[chunk];
    unsigned char dateout[chunk];
    unsigned long datelong = chunk;
    unsigned long sourcelong;
    FILE* source;
    FILE* dest;
    source = fopen(source_file , "r+b");
    dest = fopen(dest_file , "w");
    while (!feof(source))
    {
        sourcelong = fread(datein, 1, chun, source);
        datelong = chunk;
        if (uncompress(dateout, &datelong, datein, sourcelong))
        {
            fwrite(dateout, datelong, 1, dest );
        }
    }
    fclose(source);
    fclose(dest);
}
这段代码我也不打算在这里分析太多,问题很明显:代码编写的初衷,是想把文件分块处理。但每块数据压缩之后的大小并没有记录在压缩文件中,也没有采取一些诸如分隔符或区块补齐之类的定位措施,所以解压缩的时候实际上是无法忠实地按压缩时的分块来还原数据的。而出问题的那个文件,大小的确是超过了16384,于是就被弄坏了。

这里就引出了一个问题:为什么要分块?
事实上,如果这段代码没有采用固定长度的C-style数组,而是用动态内存分配的解决方案,压根都不会需要分块,也就不会出现这个Bug。当然,这只是解决这个Bug的方案之一。对分块压缩算法的理解有问题,也是造成这个Bug的原因之一。从这方面着手进行改进也是可以的,各有利弊而已。
但这不是我要表达的重点。在这个案例里,下载的文件并不会很大,几十KB就顶天了。我真正疑惑的地方在于:为什么不用动态内存分配?
可能的解释有:
  • 担心内存碎片问题
  • 担心忘记释放
  • 嫌动态分配内存麻烦
  • 习惯了这种固定长度缓冲区的写法
  • ……
也许还有别的原因,一时半会儿我是想不到了。

那么换个问题:什么时候该用动态内存分配?
这个答案会比较明确一点:
  • 空间大小不确定(运行期确定)
  • 栈上空间不够
  • 方便与线程外部传递/分享数据

在本文的这个例子中,文件的长度是不确定的,每块数据压缩后的长度也是不确定的。很明显,这就是属于应该用上动态内存分配的时候。
该用的时候不用,带来的恶果就是程序的可读性和可维护性就会变得差,出Bug的机会更高。毕竟固定长度的内存区域就一定要处理溢出问题。而且用固定长度去处理变长内容,要分块/分次,要做循环,要留意退出条件,测试时要覆盖1和N……,这些都带来了不必要的开销。
还不如直接分配一块内存出来,只要到时候记得回收就OK。性能方面值得担心的话,也可以自己优化内存管理,这是可以集中处理掉的事情。而那种用固定长度的栈缓冲区来解决此类问题的办法,好听一点叫做「质朴」,难听一点叫「土」。总不能每个需要动态内存分配的地方,都用这种土办法来应对吧。

我其实是觉得,有些程序员,会有意识(或下意识)地避免用动态内存分配。从写代码的时候就开始重视性能,是好事情,但写程序不能只看功能和性能。你写的程序,好不好懂,容不容易出问题,有没有定时炸弹,好不好改,方不方便扩展,这些也都是很重要的。性能不佳可以优化,这种代码级的性能问题(相比架构级而言)优化起来尤其容易。但其它的方面,要改善起来绝非一日之功。
往开了说,作为程序员,应该避免陷入「某个东西就是不好」的思维方式中。思维开始变得狭隘,是自身没法继续再提高(达到上限了)的标志之一。

2014-01-22

2014年1月全国性DNS劫持事件评析

许久没更新博客了。这次全国性事件既然这么轰动,震惊互联网界及翻墙界,那我就借此机会说上两句。

事件是15:20开始的,而我当时15:30刚好有个会,所以这个事件只经历了一点开头:
当时我正在整理自己的收藏夹,进行到windbg和ollydbg的时候,发现需要翻墙才能访问了。刚开始我在疑惑为啥GFW会对调试工具下手,难道愚民政策已经扩展到技术界了?随后我发现大部分时间这两个网站的域名被解析到了 65.49.2.178 这个IP上。少部分时间的尝试是正确的,但这个概率小得不足以完成大部分文件的载入。由于我用的DNS一直都是四个8,所以第一个反应就是这两个站点被DNS污染了。
既然是污染,那么应该能抓到正确的DNS回应包,只是慢点而已。但这次我发现DNS回应包是一对一的,没有多余的包回来。只是第一次解析的时候往往能解析到正确的地址上,后面再解析,回复的就是65.49.2.178了。当时我还没试别的网站。
然后开会的时间到了,我就走了。再回来的时候,故障已经基本结束了,没什么时间和机会去分析。技术方面的分析,可以参考这个。我认为分析得靠谱,符合此次事件的各种特征。我在这里只补充一些文中没有提到的部分。

首先,这不是「DNS污染」,是「DNS劫持」。
我这里不是在抠字眼,或者讨论这两个词的定义问题。我只是指出这个事实:这次GFW对于DNS的攻击方式,跟以往(或者说一直以来)的DNS污染有所不同。
一般,GFW的做法是抢在DNS服务器的正常应答之前,伪造一个应答,欺骗客户端。正常的应答仍旧会返回到客户端,只不过GFW的欺骗包会很快,相当快,使得客户端不理睬正常的回应包。
但这次不同,从抓包的结果看来,「一问一答」,并没有多余的回应包。即使DNS是境外的8.8.8.8,也是如此。境内的DNS,尚有别的办法可以进行控制。境外的DNS,必须是在DNS查询/回应包的转发路径上对其进行劫持/丢弃,才能实现这种效果。

其次,探索一下GFW这次这个DNS劫持功能的工作模式。
通常而言,要进行DNS劫持,GFW可以有两种基本做法:
  • 劫持DNS查询包:截获DNS查询包,不把它向目的DNS进行转发,然后自己伪造一个DNS回应包给客户端发去。
  • 丢弃DNS回应包:截获DNS回应包,伪造一个DNS回应包发给客户端,然后把正确的回应包丢弃,使其不能正常到达客户端。
实际上的情况,可能比这要更复杂一点。比如,丢包的事情,应该是GFW的一个状态防火墙完成的。而防火墙的规则添加可能需要一点时间,所以第一次查询时有可能会有正确的回应包漏过。
另外,根据每次都是「一问一答」看来,伪造的DNS回应包可能是防火墙规则自动触发。也就是说,DNS回应包被拦截后,才会伪造一个发给客户端。如果没被拦截,就不会伪造。否则无法解释第一次查询时正确的回应包漏过之时为什么也是「一问一答」。
综合上述情况,并结合GFW的部署和需求特点,这次的DNS劫持功能应该是采用的第二种工作模式,也就是说对DNS回应包进行处理。很显然,对于GFW而言:从「非受控区域」过来的数据,才是真正需要控制的「有害数据」。从「受控区域」出去的数据,就算会被判定为「有害」,也没必要进行处理,守株待兔就可以,说不定对方根本就不存在呢。

顺便,对GFW的一些技术细节,从这次事件可以有更多的认识。
要完成DNS劫持,有一个前提:GFW可以控制DNS包转发路径中的(至少)某个路由器,或者GFW自身(的一部分)就是DNS包转发路径中串进去的一环。相比之下,如果要做到以前的DNS污染,只需要在交换机上旁路接入一台设备,不需要串在路由路径中。
具体而言,从这个DNS劫持的功能看来,应该会有三个部件参与:
  • 识别模块:这个可以由一个IDS性质的设备来完成。对来自「非受控区域」的DNS回应包进行检测。这个完全可以在旁路慢慢做,不影响网络出口的性能。
  • 过滤模块:当识别模块检测到「有害信息」后,会向一个状态防火墙添加一条动态规则。生效不一定很快,但因为是全国性质的,漏也漏不了多少。这条动态规则包括丢弃符合条件的DNS回应包,以及驱动欺骗模块去伪造一个DNS回应包。这个设备必须串入骨干路由,应该是部署在互联网出口处,基本上必须是一个群集。
  • 欺骗模块:伪造的工作是跟过滤模块联动的,即:丢弃-伪造。这个模块以前应该就存在,部署在旁路上就可以。

回头想想,这些都并不是什么前沿的技术。花不了多少时间我自己都能写出来。目前阻碍这个功能(DNS劫持)大规模应用的因素,可能主要还是来自性能方面的压力。否则现在对那些敏感域名仍然在大量采用的低效的DNS污染早就该换成劫持了。在性能方面而言,用旁路模式当然会好很多。有关人等大概也知道,在DNS上无论怎么折腾,也都是锁君子锁不住小人,索性不把宝贵的性能浪费在这里了。

2013-12-12

关于好奇金装纸尿裤条码的问题

从儿子出生以来,基本上一直用的好奇。主要是用的金装的。中间有一段时间用过银装,感觉效果不好,后来就再也没用过。也买过一箱帮宝适,感觉不太好,混用了一段时间,后来也没买过。一直觉得好奇金装的效果很不错,当时只是觉得宝宝不会红屁股,别的还没想太多。

前段时间爱婴室发短信给我们,说好奇全场75折。跑过去「抢」了一包M号两包L号,以为到下次再买将会是明年的事情了。这些天旧的用完了,于是刚启用这几包,却发现很不对劲。以前从来不出问题的好奇金装,现在晚上开始漏尿。开始时检讨可能是自己的问题,于是仔细检查,小心包裹,包好后注意用手指把侧面的挡给竖起来。但就算是这样,还是会漏。后来发现好像是吸水性太差。吸不了多少尿,表面就会开始渗出来。一个晚上裤子得湿两趟,运气不好连衣服被子都得湿。而换下来的纸尿裤却并没装多少尿。不管M号还是L号都这样。

上网准备看看别的品牌是不是会好点,查下来才发现原来所有品牌都有人反映有这种问题。有的说是买到了「假货」,有的说是产地和/或批次的问题。总之感觉是质量问题。我们也觉得早先在超市和网上买的好奇金装用得好好的,就算一大包尿沉甸甸的,表面可能会有潮气,但至少不会把裤子给搞湿。难道真是遇到所谓「假货」了?

于是,昨天中午,我去超市又买了一包好奇金装L号。回家一比,从外包装上就看出问题。其实问题很明显:条码压根就不对。超市买的是880开头,正宗韩国货。不对劲的那几包,则是69开头,国货!册那,我本来应该能看出来的,之前买进口牛奶的时候,对于条码已经很熟了。还是太大意了,买的时候以为只要是金装都没问题,没想到会遇上李鬼。

李鬼的外包装上还写的是「原产地:韩国」,但这条码明显就不是。网上搜了一下,一种很流行的说法,包括各电商客服的回复,都是说:不管880还是69都是从韩国进口的,69只是中国这边要求韩国厂商在外包装上印上69的条码。

这种说法貌似是来自进口商那边的标准口径,我估计不同的意见大概也被公关和谐得差不多了。但是事实是不会说谎的。昨天晚上宝宝就包的正宗韩国货。果然,一晚上下来,完全没漏,裤子一点没湿。前天用的69货一晚上湿了两条裤子。进口货就是让人放心。我看网上那些评论晚上侧漏或吸水性差的,大概都是买到了69货。

既然商家都是这个说法,理都没处找,经济损失可能没法挽回。只能以后买的时候自己当心,都去超市看清楚条码再买,国内电商的网购就不指望了,贵嘛就贵一点好了。大冬天晚上尿湿被窝,然后被人拎起来换裤子,换你是宝宝你乐意?

唉……,国货,我该说你啥才好?其实就算是国货,只要好用,我也不会觉得受了多大的欺骗。可你这国货连张纸尿裤都做不好,我还能指望你啥?!

2013-10-23

黑客故事3:谈谈密保问题

Internet上,从很早开始,就出现了一个东西,叫做「密保问题」。
「密保」是「密码保护」的意思,有的也叫做「密码找回问题」,反正都是一个意思:自己设一个问题,和一个答案,如果密码丢了,靠这个答案就能重设密码。
这里面,重要的是「答案」。「问题」嘛,只是用来帮助你回忆起「答案」是什么。理论上,这个问题的答案应该只有你自己一个人知道。很多网站在注册的时候也提示了,像谁谁谁的生日、姓名、电话号码等等不止一个人知道的东西,最好不要用来做密保问题。

一般说来,要让密保问题有点价值,下列办法都是可以考虑的:
  • 填一个牛头不对马嘴的答案:问题是这样很容易忘记。
  • 用自己心中的小秘密:嗯,这个听上去不错哦。
  • 填一个错误的答案,或者正确答案的反义词:若能坚持这个原则,倒是可以考虑。
  • 不管什么问题,答案总是填自己的第二密码:这就相当于多记一个密码,而且还是不常用的密码,很容易忘。
  • 瞎填一气,自己也不记得:那就相当于放弃这个功能,倒也不一定是坏事。
想来想去,好像没有什么太好的办法。始终还是那句话:安全的不方便,方便的不安全。其实,高级一点的点子,例如手机短信绑定之类的,可能还有一定的准入门槛,但邮件找回密码应该是不需要多少成本的。我自己就做过一个,很简单。虽然邮箱也很容易被盗,但至少,你把防盗号的责任丢给别人(邮件服务提供商)了。

※  ※  ※  ※  ※  ※  ※  ※  ※  ※  (好了我知道该讲故事了)

有一年的夏夜,我在网上闲逛,遇到了一个灰色站点。这种站点往往是很好的练手目标,对它无论干什么事情,都不会有实际上的法律风险。我这次遇到的这个,是一个成人交友社区。其实就是找一夜情的,不过在我看来更像是皮条客网站。网站制作极其简陋,可见其作者就没打算在技术上投入多大力量。也因此,它拥有一个很初级的密保系统——不限尝试次数,当场返回结果,回答正确后立即允许修改密码。

这个皮条客网站的设计,从业务层面来说,是下了一点功夫的。女性能看到男性的所有资料,而男性要看女性的联系方式,需要成为「会员」。换句话说,得掏钱。

会员费一年大约一百多,说多不多,说少也不算少。我很好奇,真的有人会为了这种事情花钱吗?于是我注册了一个女性的账号,进去看了一下。嗬,会员还真不少。而且那些个傻男人为了勾搭女人,还把自己的资料一股脑地往上放,写得那叫一个详细。他们可能以为真的有女人会看了资料里面填写的「尺寸」之后主动联系他们吧?

好吧,资料齐全的一个坏处就是,社工变得相当容易了。虽然我没那个闲工夫。但光是翻翻这些资料就挺有意思的。另一个要命的地方是,还真的有人用生日做自己的密保问题的,而且他在个人资料中还真的如实填写了自己的生日。这我就有点搞不明白了,这是要向女神双手奉上一切的意思?

嗯,于是我就小花了点时间,稍微检查了一下这帮家伙的密保问题和答案,还真有点意思:

  • 问题:13579;答案:24680。这种,唉……,怎么说呢?算鄙视他人的智商吗?
  • 问题:1234567890;答案:qwertyuiop。诸如此类也不少。这算是懒吗?
  • 答案是自己生日、手机号码、身份证号码等等的,就不说了。居然还有把问题重复一遍作为答案的。真的以为没有人能猜得到吗?
  • 有个家伙,密保问题的答案就是「1」。我都要笑死了。这是在玩「最危险的就是最安全的」游戏吗?

其实,我能理解。注册这种网站的人,在密保问题上不一定特别较真。你真让他注册网银账号,十有八九不敢这样玩。不过一年也要一百多块钱,换作是我,才不舍得就这样就扔掉了。哎,咱们村果然到处都有土豪是吧?

※  ※  ※  ※  ※  ※  ※  ※  ※  ※  (好了故事讲完了,我是不会告诉你们那些女人的QQ号的)

弱密保答案,并不是大问题。真正的大问题还在于:你是不是在所有网站注册账号的时候,都用了同一个密保问题,或者同一个密保问题答案。

也许这样会比较好记,但是特别容易遭受钓鱼攻击。人往往在急着想找某个资源的时候,特别容易犯这种错误:那个资源只在某个论坛上有,但要下载贴子里面的附件需要先注册用户,而注册用户时需要填一个密保问题。

好了,现在别人有你的密保问题了,当然,密码也有了。不过密码上次在CSDN事件中被搞过一回,大家的警惕性都还比较高。而密保问题有的人可能就会忽视了。

安全意识够的用户,当然不会填跟别的网站上密保问题相同的内容。但问题是,要始终坚持这个原则,记性得足够好才行。最好的办法,就是用随机字符串当密保问题的答案,然后交给1password之类的东西去管理。这样一来,密保问题就跟密码其实是一回事了。——其实本来就是多此一举:如果根据密保问题就可以拿到密码,那么干嘛还要去记密码呢?真是的。

总的说来,密保问题这个东西并不是一个好的设计。它如果单独作为一道安全关卡,很可能会降低整个系统的安全防护等级。而如果配合别的安全措施一起使用呢,带来的好处并不见得会多,倒是会增加忘记的风险,最后变成画蛇添足。建议技术能力不够的网站,还是把用户认证这种事情交给专业的来做吧,比如Google Open API之类。起码这样皮球就踢给别人了。

2013-10-18

终于把户口迁到了上海

写这些个没有什么别的目的,一来给这漫长又烦心的事情划上句号时留个纪念,二来在某些具体的事务处理上希望对他人能有所帮助。

Chapter One

大约一年多以前,公司领导问我有没有意向把户口迁到上海。

这事儿其实到公司面试的时候就给我画过饼。其中的关节我也清楚:「高新技术成果转化」,要报项目,就需要有个项目负责人。这个人如果是外地户籍,那么就可以顺势申请人才引进。而反正得写个人,名额当然是留给公司的骨干当福利。既然是骨干,的确也是「人才」嘛。

因为老婆是上海户口,所以我其实并没有很强烈的要迁户籍的需求。但本着:

  1. 想把一家人的户口放在一起。
  2. 不想每年都因为续办居住证的事情跑东跑西费力伤神。
  3. 退休前总归是要迁过来的,不然养老金白缴一大坨。

的考虑,我还是很爽快地接受了公司提供的这个福利。

Chapter Two

表达了我的意愿之后,大概公司方面一直在折腾项目申报的事情,从年初一直等到夏天快过完,终于有动静了。项目申报应该是已经差不多了,至少是批下来了。于是给到我手里一份清单,让我提交相关的材料:

  1. 学历学位证书原件及复印件;
  2. 引进人才单位的营业执照、机构代码证、高新技术企业、软件企业原件及复印件;
  3. 成果转化认定证书原件及复印件;
  4. 盖章后的项目认定申请书原件及复印件;
  5. 劳动合同原件及复印件(从进单位起且申报日起三年以上);
  6. 人事档案所在单位出具的同意调动函(原件,如果档案在上海则请档案保管单位出具档案保管证明);
  7. 政治表现鉴定原件(包括是否参加法轮功等邪教组织、是否有刑事犯罪记录等);(由档案保管单位出具)
  8. 未婚者提供未婚证明,已婚者提供结婚证书原件及复印件,离婚者提供离婚证书原件及复印件
  9. 上海由落户条件的证明;房产证、直系亲属的居民户口簿、同意落户证明
  10. 引进人员业务考核能力证明(专利、论文等,需要提供原件及复印件);*
  11. 居住证原件及复印件、保险缴纳证明(网上打印并请在保险证明页面上写上用户名和密码)、近一年纳税证明等;
  12. 已婚者其配偶及未满18周岁子女随调;
  13. 在上述条件已准备好的基础上,在区级以上医院体检;

蓝色的部分,公司可以提供。红色的部分,跟我无关。其余的,就是需要我提供的东西了。
应该说来,这份清单并不算很过分,基本没有什么故意刁难或刻意抬高准入门槛的成分。于是我就着手开始准备了。一条一条地过:
  • (1)学历证、学位证:这个相信能办下居住证来的,基本都没有问题。
  • (6)同意调动函:这个是啥?看括号里面的内容,由于我档案还在重庆那边,所以看起来至少得托人跑一趟。
  • (7)政治表现鉴定:这个又是啥?不过从括号里面的内容看来,我觉得不是啥重要玩意儿。并且应该和上一条一起办掉。
  • (8)结婚证:这个也没有问题。
  • (9)落户证明:这个也是居住证的必要材料之一。不过虽然房产证上有我的名字,因为老婆是户主,是否需要她签署同意落户证明?我不太清楚。我们还是写了一张,不过从最后还给我的材料看来,应该是不需要的。最后上户口的时候派出所也没有要求这个东西。
  • (10)业务考核能力证明:这个也不知道是啥。咨询过办事人员,说这个是可选的项目,没有的话就不用提供。
  • (11)居住证、保险缴纳证明、纳税证明。
    • 1.居住证:没有问题。但由此看来,要办人才引进的落户,貌似一定要先有居住证。
    • 2.保险缴纳证明:在网上有两个页面,一个页面是应缴和实缴分开的记录,另一个页面是一个表格,有打印按钮。我一开始打印成了后者,但材料被退回来,说要的是前者。我也不知道这两者有什么区别,光看内容我觉得两者应该都可以才对。反正对方要求什么就给什么吧。后来过了一段时间,再看后者的页面已经不太正常了。大概有很多人都打错了吧。
    • 3.纳税证明:清单里面写的是只要近一年,但交了材料后又说需要到上海之后的全部记录。这坑爹玩意儿搞了我很久。
  • (13)体检很简单,找家二级以上医院缴钱就行。可以在网上查一下,有的医院周六也可以体检,并且可以对比后找一家收费便宜项目简单一点的。嗯,收费便宜项目肯定简单嘛。我是在枫林路那个中山医院做的。
初步看起来没啥大问题。红色的几个项目可能需要花点时间,但应该都还好,至少我是这样觉得的。
事实证明,图样图森破,我错了。

Chapter Three

档案的问题,其实是个老问题了。

2002年毕业之后,根据报到那一套手续来到一家当时还挺大的单位工作,在福建省。工作刚满一年没多久,我就辞职了。而档案当然就扔在原来的人才中心没有去管。

后来过了大约一年,我准备把户口转回重庆老家。当时也经历了很多的麻烦,其中之一就是,档案转到了重庆之后,这边的人才中心说我档案里面缺材料,缺个什么干部转正定级表。解决办法是让我回原单位去补这个材料,因为我已经工作满一年,理应有这个。可见是原来公司的人事偷懒没有做。当时一来因为不想买飞机票再过去一次,二来原来那家当时还挺大的单位,在我辞职后短短半年内就分崩离析从市场上消失了。所以在经过一阵扯皮后,这事情以重庆人才方面强调说他们只是代为保管我的档案,不把我当干部,而告一段落了。

于是,这次要去开「同意调动函」的时候,又遇到了这个问题。重庆人才说他们开不出来,理由是我没有干部身份,不是他们那边管的「干部」。而上海人才这边的说法是「什么干部身份?都什么年代了。我们不需要这些个」。两边各执一词,最后重庆人才勉强写了一张东西,不过在上面坚持注明了「没有干部身份,无法开具行政工资介绍信」等字样。

相比之下,「政治表现鉴定」就更搞笑一些。根据文档清单,这个玩意儿应该是找档案保管单位,也就是重庆人才开具。重庆人才说你又不在我这边工作,我不了解你的表现,找社区去开。社区那边又说你不住我们这边,人在上海,我怎么知道你表现怎样,回上海去开。

其实这两家的反应也在我的意料之中。如果真的回上海,肯定又会说你户口不在我们这边,不是我们辖区的居民,回户口所在地开去。所以又开始了扯皮,最后的解决办法是:找我现在的工作单位,开一个政治表现鉴定材料,盖上单位的章。然后给到重庆的社区这边。重庆这边收了我上海单位的材料,他们再开一个给重庆人才,最后重庆人才再开再盖章。搞笑的地方在于,我工作单位只是一个民营企业,居然轮到它来证明我爱党爱国。

总之,整个过程就是一层层踢皮球,一层层为自己免责。反正你只要能帮他们找到一个担责任的,让他们开东西就很容易,否则就很困难,塞烟塞钱都不一定顶事。这个规则,熟记于心,以后找政府机关单位办事情就会容易很多。

Chapter Four

开纳税证明的时候,又碰到另外一个棘手的问题。
我到上海后工作的第一家公司,在我离职前几个月,财务出了一些纰漏。那个穿着背心就来上班的老头子会计,不怎么会用Excel,在报税的时候,把当时公司里所有员工的身份证号码最后三位都给截掉了。于是,我去打印税单的时候,最后那七个月的记录怎么也查不到。

这事儿以前续办居住证的时候就遇到过麻烦。好在当时还能通过人工干预的方式,把我那个被弄错了的以000结尾的身份证号码对应的税单给打印出来。办居住证可能要求没那么严格,于是就这样过去了。这次却被卡住了,税务系统的软件大概升过级,身份证号码不合法根本不让打印。而上海负责人才引进审批的这边要求纳税记录一个月都不能缺。

公司办这事的人后悔死了。早知道这么麻烦,当时在我简历上把这几个月给抹了就是了。可现在项目已经批下来,作为项目负责人我的简历也是其中材料之一,要改的话整个得推了重来。基本上是不可能的,于是又得我去搞定这事。

应该说,一开始走了一些弯路。因为不想请假,所以委托父母去办这事。但委托他人就有一个问题:受托的人不知道啥时候该硬啥时候该软,分寸不好拿捏。松江区税务局的不知道哪个混球跟我父母说这事儿错都错了,打印是肯定打印不出来的,改也改不了,得叫我原来单位的财务来打印才行。他们就相信了。

于是我联系原来单位的老板。所幸我们关系一直都不错,我离开后私下也有一些联系。于是派了单位的财务去跑了一趟。这个时候委托他人的第二个问题又浮出来了:你急他人可能感受不到,也不见得会为你尽心尽力地去在某些事情上努力去争取。松江区税务局的人跟那个财务说,你来也没用,打印不了。于是这事就又卡住了。

这件事情上最主要的一个经验教训就是:办棘手的事情,一定要自己出面!
我请了假,亲自跑了一趟松江。在办税大厅里面兜了两圈,我发现二楼有个咨询台,里面坐的是正经的工作人员而不是前台小妹或保安大叔。去那个咨询台问问题的人,总是很快就离开。站在旁边听了一下,工作人员的解答很明确也很专业,似乎对每个问题都早有答案的样子。我觉得,这就是问了顶事儿的人。楼下小妹那边问了可能也是白问。

所以,另外两个经验教训就是:问事情要问对人。多看多听一定没错。
果不其然,我刚把我情况说完,对面就给出了很明确的答复:你这个情况,需要补申报。反正你也是零申报对不对?那就很简单了。balabala……
接下来的事情,说简单不简单,但至少路是变得清晰了。
  1. 在大厅拿一张申报个税的单子。
  2. 因为单子里面的东西太过专业,所以联系原单位的财务,在其指导下填写。一行写一个月的情况,一张表刚好写七个月。
  3. 拿着单子到原来的单位里面,盖个公章。
  4. 联系上原来单位的税务专管员(大妈一个),到对方所在的税务所(在欢乐谷那边,跑死我了),让其签字同意。
  5. 联系原单位的财务,制作报税用的压缩包。复制到自己的U盘上(顺便看了看文件格式,土得掉渣。开发这种软件大概真不需要什么技术含量吧)。
  6. 拿着U盘和申报单,去办理补申报的事情。我本来以为是到区办税大厅,结果后来被支到某个税务所。反正事能办掉就好。
  7. 如果着急的话,留下自己的电话号码,让对方在补好税之后,打电话通知自己。得到通知之后,就可以去打印出完整的个税缴交凭证了。如果对方不同意打电话通知,拍桌子把他们领导轰出来。纳税人要有点纳税人的样子!

没错,上面那一句也是一个经验。你不欠他们的,他们欠你。当然,如果工资高到不是零申报的话,过程可能会麻烦一点。反正问专业人士就对了。

Chapter Five

以上事情折腾完,春节都过了,已经到了第二年。我本来以为一切都OK了,谁知道又有波澜。公司这边的办事人员表示,还缺一些东西,包括:
  1. 我太太的简历,敲她公司的章,还要公司出具一份工作证明。
  2. 婚育证明:我当场表示,去年我还未育,现在我有儿子了。于是让我提供儿子的出生证明。
  3. 我的户口簿和身份证。
好吧,前面两个算是我们对之前那个清单的理解错误。貌似就算配偶和子女不随调/随迁,对方也要拿到所有的证明材料。所幸这些材料我准备起来都没有什么问题。但是过了一段时间我又接到电话,问我户口本上盖的派出所的章和我身份证上的派出所名字对应不起来,是怎么回事

好吧,由于当时王护士长已经夜奔过了,所以我就在电话里面把他大骂了一通。对方表示充分理解,但还是说因为在系统里面找不到你原来的派出所,所以这事情又没(ka)法(zhu)做(le)。不管我怎么解释都没用。

好在这不算什么大问题,毕竟和前面那些个问题比起来,我在这个事情上完全没有任何责任和过失。最后沟通下来的结果,是让我到重庆新派出所那边去办一个户籍证明,拿到上海来交上去就算了事。

又过了几个月……,真的是几个月,大概审批需要时间吧。大约在八月底,我终于拿到了据说是审批通过了可以去办调动手续了的几份材料:
  • 《迁沪落户确认单》
  • 《调动人员情况登记表》
  • 《调令》(都这样称呼,但实际Title不是这个。红头文件,有文号的)
  • 《申报常住户口登记表》
我长出了一口气——终于结束了!
我又错了,还早着呢!

Chapter Six

拿到调动材料之后,我真的是还没高兴几分钟,就被泼了一盆冷水。《迁沪落户确认单》上面写的「从福建省」而不是从「从重庆市」。没理由搞错啊?我提交的材料上,最多只有简历提到了曾在福建省工作,但上一份工作已经是在上海了。户口、身份证、户籍证明、人才中心开的所有材料上面,都没有跟福建省相关的东西。这事更可能是人事局那帮人的工作失误。于是这张单子只好让公司交还给人事局那边重新去修正。

因为只有一份材料上有错误需要修正,所以我本来准备先跳过需要这份材料的步骤,先办下面的事情,至少先把耗时间多的「调档」这桩事给做了。但后来就发现要办的手续其实是一环扣一环的,要调档就会把《调令》原件给收掉。而《调令》在第一步骤「开具《准予迁入证明》」的时候就要用到,于是之好停住等修正完成。由于当时公司有一些人事变动,所以以上材料交到我手上的时候,离开具日期已经又过了快一个月。众所周知这些政府公文都有时效性的,材料上就有注明「有效期XX天」。现在又有内容搞错需要重开,这下我的时间就变得很紧张了。

大约又过了两个星期,终于通知我说《迁沪落户确认单》改好了。其实就是拿笔划掉「福建省」然后写上「重庆市」并敲一个更改章。这点工作当然不需要两个星期,但这些政府机关办事效率就是有这么低,特别是在逐级提交的情况下。所以这里又有一个经验教训:赶时间的事情,尽可能自己牵头来主导。

Chapter Seven

材料齐备之后,第一个步骤很快就搞定了。虽然公安分局那边找茬说要看房产证,而我去办的时候并没有带,但当领导被轰出来之后,事情很快就得以解决。这也就是政府混球之所在:手续上或指南上并没有写需要房产证,基层的人想看,于是就要看,领导说可以不看,于是就可以不看。这帮混球压根就没想过,谁才是他们该服务的对象!

但是,在重庆人才那边,老问题又跳出来了。
重庆人才说,你档案里面缺东西(干部转正定级表),不具备「干部身份」,档案可以给你寄过去,但行政关系介绍信我们开不了。
转而咨询上海人才,答曰「行政关系介绍信跟干部身份有什么关系?不是干部还不能调动工作了?你们内地就是搞!」

来回交涉了几次,基调始终是如此。上海说我们这边九几年就取消大学生的干部身份这回事了,现在都市场化就业了,我们这边都开《流动人员介绍信》,你们那边不管什么介绍信,反正要开一个过来,否则你以后社保什么的可能会遇到问题。重庆这边就咬定了我们这边只开过《干部介绍信》,别的没开过不会开也不能开。还拿出一份写着我自愿把档案转走,介绍信不开,转走以后有任何问题都与他们无关的确认单骗我委托办事的人签字。把领导轰出来也没用。

现在平心而论,重庆人才是一坨狗屎。骗人签字这种下三滥的手段也做得出来。当时字都签了,还好我打电话给追回来了。在旁人看来,上海都开绿灯表示愿意接收了,你重庆有什么道理不放人?大家都在猜重庆那边是不是在讨好处费。且不说内地落不落后什么的,薄王等人能够在重庆兴风作浪,怪不得别人。

这事儿最后是这么解决的:我爸亲自驾临重庆人才,脸红脖子粗地把他们领导轰出来,然后让他打电话到上海人才这边沟通,最后双方才达成一致。解决方案是,重庆人才寄出我的档案,同时出具一份证明信之类的东西,大概就是把为什么不能开具行政关系介绍信的原因讲一下,跟着档案用机要件一起寄到上海。如果有类似情况的朋友要参考这个做法,建议让双方人才直接沟通,别的上海人才中心要的东西可能不一样,具体要以对口双方协商达成一致为准。

Chapter Eight

好吧,我一度以为最大的绊脚石已经没了。
实际上,最大的那块,的确是没了,但还有点别的问题。先说说接下来一些手续的办理情况。

办完调档手续,收取50元寄费,重庆人才说每周一、三会集中寄一次档案。当时办理的时候是周二,周四再去问,答曰已经寄出了,要大约两周才能到。然后就去派出所开《户口迁移证》,这一步没有遇到什么问题(其实在派出所一直都没遇到什么大问题),接下来就是等档案到上海了。

大约过了一周,我打电话到上海人才。对方告诉我,首先,我的档案还没到,其次,到没到我可以从网上查。找了一下,查询页面原来在这里
这个页面对于Chrome的支持不算太好,不过仍算可用。如果档案到了,会提示存放于哪个人才中心,以及IC卡号。能查到这些,就说明档案已经到了。

等档案的时候,把《申报常住户口登记表》给填了,敲上单位的章。档案到了之后,就带着所有材料(能带的都带上,不想跑冤枉路了,也懒得每次都轰对方领导),去人才中心。人才中心在《申报常住户口登记表》上填写、敲章,收档案保管费,然后开具存档凭证(后面的手续没怎么用到)。人才中心一共就没几个人,中午把门锁起来,大概在睡午觉——唉,算了不吐槽了。

接下来,要带着材料去梅园路人事局那边开《申报户口证明信》。这次又碰到一块绊脚石:打印出来的《申报户口证明信》上面又是写的从福建省调入。修正方式还是和上次一样,笔划掉写上正确的,然后敲更改章。人事系统这一块的事情至此算是完结了。剩下的都是公安系统的事情了。

带上所有材料,到落户地派出所上户口。去照身份证照片,采集指纹,交20元工本费。然后户口页就可以打印好了。身份证一个月之后来拿。到这里,整个人才引进落沪的手续,基本算是完成了。其实办这一步的时候,《迁沪落户确认单》的有效期严格说来已经过了。但是一来由于有十一长假在中间,其次也没有超过几天,所以对方没问,我也没提,你好我好大家好才是真的好。

Chapter Nine

最后这一章节,把审批通过之后的所有流程重新整理一下,列个表。供有办理同样手续的朋友参考。网上能查到的这方面信息实在是不算太多。

序号
办理地点
代办*
需要材料**
开具材料
备注
1
落户地公安分局
调令
调动人员情况登记表(收)
迁沪落户确认单
身份证
房产证等
准予迁入证明

2
档案保管单位
调令(收)
身份证
档案(寄出)
行政关系介绍信(寄出)
收取寄费
3
原户口所在地派出所
准予迁入证明
原户口簿(收)
身份证
户口迁移证
收原户口簿中个人页
4
接收档案单位
否***
申报常住户口登记表
调令复印件
身份证
申报常住户口登记表(章)
存档凭证
收取档案保管费
5
梅园路77号819室
不清
申报常住户口登记表(收)
户口迁移证
身份证
申报户口证明信
部分电梯不到8楼,乘坐时需注意
6
落户地派出所
迁沪落户确认单(收)
准予迁入证明(收)
户口迁移证(收)
申报户口证明信(收)
身份证
新户口簿(若有)
房产证
新户口簿
身份证申领凭证

收取身份证工本费
7
落户地派出所
不清
身份证申领凭证(收)
旧身份证(收)
新身份证
上一步骤办理一月之后
*委托他人代办时,应准备好委托人和被委托人的身份证复印件,以及被委托人的身份证原件。
**有些基层办事人员会临时起意要看更多的材料,所以最好是把能带的都带上。如果只能带一部分,建议事先电话或现场咨询好,以免白跑一趟。
***据说必须本人办理,但从办理内容上看没觉得有这个必要性,只是没有去亲自试验。

Chapter Ten

经验教训总结如下:
  • 棘手的事情,尽量自己亲自去现场办。
  • 赶时间的事情,争取自己主导,尽量避免提交后等结果的做法。
  • 多听多看,就算赶时间也不要慌乱。
  • 问事情要问对人,无足轻重的事情可以问保安,关键事情要问专业人士。
  • 多方各执一词时,拉到一起来沟通。中间转来转去你谁也说不服。
  • 能带的材料尽量带,公务员的节操无下限。
  • 中国公务员怕领导,办事难就把领导轰出来说话,最好是有领导不敢惹,保安不敢碰的角色出面(比如我爸)。
  • 赶时间的情况下,尽量选轨道交通+Taxi,公交车不太靠谱,而且有的站合并了改线了拆了你对地方不熟的话不一定知道。
  • 委托别人办事,一定要明确而仔细地授权,让对方谨慎办事,有意料之外的情况多电话沟通。
  • 办事难很多都是因为怕担责,要化解的话,要么帮对方找到可以推卸责任的「下家」,要么把能担责的人给叫(hong)出来。
  • 税务局办税大厅有免费的纸和复印机用,有些证件你没事多印几张终归是没错的。
  • 公务员跟你说「办不了」、「没办法」,不见得就真的没办法。千万别气馁。如果你觉得这事没啥原则性问题,那么那些公务员只是懒和不负责任而已,一定会有路子的。

2013-09-22

GoAgent证书问题一例

昨天准备在老婆的电脑上用一下GoAgent,结果发现很多网站都不能用。很奇怪的是,Twitter页面能打开,但CSS/JS看起来基本上都不对。而在我自己的电脑(LAN内部)上却是好的。所以很明显是Local而不是Network的问题。
看GoAgent控制台上的日志,问题似乎跟SSL的连接建立有关系。再把Chrome的「审查元素」功能打开,Console里面一堆错误。随便挑了个页面试图打开,好了,这下清楚了,证书有问题。
看了看GoAgent的官方Q&A,基本上只提到说证书需要导入。很多在网上问这类问题的人,得到的也是类似回答。但问题在于,证书的导入是没有问题的,重新导入也没有效果。而且并不是所有网站都不能通过GoAgent代理。

其实问题很简单:GoAgent仿冒的证书被占用啦。
官方其实也提到过这个事情:
因为GAE平台限制,没法支持真正的ssl加密,goagent只能通过伪造证书的方式做到代理ssl加密的网站,这个证书就是用来欺骗浏览器的。
GoAgent实际上相当于一个「中间人」。当访问HTTPS站点时,就得采用SSL中间人攻击的类似方式,才能完成代理的工作。SSL中间人攻击怎么弄?导入受信任的根证书,然后利用这个根证书签发的证书把内容拆开后重新组装、加密、封包,骗完甲方骗乙方,欺骗通讯双方。否则两端任何一方觉得这内容不对劲,SSL传输就会失败。这其实也就是为什么必须要干掉CNNIC相关的根证书的原因

所以,对于每一个HTTPS站点,GoAgent都会生成一份用自己根证书签发的数字证书。看看GoAgent的local目录下,如果访问过HTTPS站点,则一定会有一个certs目录。这生成的证书,就放在这个certs目录下。其实一看这个目录里面都有些什么文件,就很明白了:
这次的问题在于,GoAgent有不同的版本,其携带的根证书也是变化过的。至少我机器上随便打开CertMgr就见到了五个不同的版本:
如果升级的时候不把certs目录清空,就有可能会有部分站点对应的证书还是以前的老的、用旧的根证书签发出来的。GoAgent客户端一看,噢,证书已经有了,就不再重新生成了。但Chrome觉得证书不对,于是SSL握手就被挡了。

解决办法很简单,每次升级GoAgent的时候,把local/certs目录删掉。或者干脆每次用新目录来升级好了。

2013-09-21

自己给iOS7升级下载加速

通知出来了好几天了,今天准备给老婆的手机升iOS7。于是先把iTunes升到11.1(下载速度还不错),然后连上手机。一检查,嗬,1.19G,告诉我下载要18个小时。
按照惯例,打开IE设上代理,准备用GoAgent加速。现在估计用时只要不到一个小时,完全可以接受。
但是担心的事情来了,免费GAE的每个AppID有1G/天的流量限制,而我的GoAgent没能及时切换到下一个可用的AppID,结果iTunes这边报了个错,然后下载又重新开始了。没想到这iOS升级包的下载居然不支持断点续传。我又试了下,哪怕是手动点「暂停」,也没法进行续传,每次下载都会重头开始。看来这乔布斯死了之后,苹果真是要没落了。

接下来的时间,我考虑了以下解决方案:
1. 开VPN:可手头上的VPN速度都跟直接下载差不多。何况有些VPN还有流量限制。不肯花钱的后果就出来了。
2. 找代理:手头上没现成的。不管是去搜Google还是开ProxyHunter都得花时间。懒得去找了。
3. SSH Tunnel:目前手头上访问起来快一点的只有台H3C的交换机,大概是深圳的地址。不过SSH没开,要想架隧道还得要我去帮它开。由于担心被抓去集中营活摘器官,并且从这台交换机到appldnld.apple.com的ping值并不好,所以最后还是放弃了。

最终,还是自己找了组appldnld.apple.com比较快的地址,解决了这个问题。100ms左右的ping值,偶尔丢包。放在hosts里用上去之后,显示的估计用时也是不到一小时,跟开GoAgent加速的效果相当。那就先这样用吧。话说这苹果的DNS设置咋自己就解析不到这组地址上去呢?是我RP问题?