12306BookingAssistant 代码和安全浅析

BookingAssistant和chrome结合感觉不错,github地址:https://github.com/zzdhidden/12306

大致结构:

1. 以chrome的User-Scripts插件安装到chrome中,User-Scripts介绍

2. 使用jQuery来减少代码,注意他使用了一个奇葩或者因为我孤陋寡闻所以不知道的回调函数,用以加载jQuery运行,在代码里的函数声明为 function withjQuery(callback, safe),safe默认true。

3. 主体使用function route(match, fn) 绑定在不同链接下运行的不同函数,例如登陆页面,查询页面,订单页面等,识别出当前页面后,插入一些html元素来交互。

4. 具体的语法和特殊函数的意义这里就不做更多研究了,有兴趣可以阅读代码提取一些功能来玩一玩。

安全方面

因为某人的质疑所以还是整理下。

1. 用户的账号,密码域只用在submitForm()函数中,用于拼装jQuery.ajax的http报文。(不过12306的登陆密码是明文的…)

2. 用户身份信息,选择的表单结果同样用http报文发送,这里会把from的数据都serializes说白了就是拼到一起后放在data中。

3. 综上,别瞎操心了,12306最初就计划让你的帐号和身份信息在互联网上裸奔。

4. 其实我挺好奇SRCA根证书在整个过程中到底起了什么作用,回头问问同学。

后记:

I. 之前的明文传输的结论是错误的,因为目前12306采用https协议,而https协议是在传输层加密解密的。而SRCA证书应该正是用在这里的,详见wiki-https,所以传输上是应该安全的。

II. 此外就是要考虑会不会在本地有木马或者注入或钓鱼来获取了,这个以后有空会再琢磨。

III. 昨天订了张车票,有一些经验:
1. 提前的天数会算上今天,提前天数会有变动,注意查询。
2. 虽然是10点开始放票,我是11点才想起来可以订票了。
3. 使用chrome会坑爹的不能打开一些网银(根本就是大部分网银好不好),我解决的办法是直接打开招商银行注册了手机支付功能,会发送一个链接到手机,登陆手机浏览器网页完成验证,另外银联的功能好像不错,可惜没尝试(广告..?)

2011年12月30日

孤灯曲径残影石,酒翁踏水一蓑衣;

我自将心葬明月,楼兰夜色几时还。

C++ 原地归并

起因是之前面百度,被面试官鄙视在了原地归并,后来翻了翻代码,其实不难,可能是当时没有突破思维把。

刚刚hzh又提起原地归并,发现自己都忘的差不多了,坑爹,还是写下来。

 
void merge(int * v, int n, int pos) // 数组v, 有n个元素,从pos位置开始分割,前后两段分别有序
{
    int fir = 0, sec = pos;
    while (fir < sec && sec < size) {
    while (fir < sec && v[fir] <= v[sec]) fir ++;
    int max_move = 0;
 
    while (sec < size && v[fir] > v[sec]) sec++, max_move++; // 核心,用来统计这一段元素到底该插到什么地方。
    exchange(&v[fir], sec-fir, sec-fir -max_move) ; // 特殊的放置函数,后面会举个栗子的
    fir += max_move;
    }
 
}
 
例如:       1 2 6 7 | 4 5 9 8  n=8 pos = 4
首次循环停止时, fir =  2 , 因为 v[2] = 6 > v[4] = 4,  
随后 sec 和 max_move 加了两次,因为 v[2] = 6 < v[6] = 9
 
传入 exchange的参数为  (&v[2], 4, 2) 
 
表示从第三个位置开始(也就是6在的位置),之后的4个元素(包括它),整体循环右移2次,
 
然后就变成了 1 2 4 5 6 7 9 8,  fir + max_move, 移到它的新位置,后面的特例就不再分析了。
 
最后这个方法的复杂性就落在了 exchange上,不过如果用链表来实现就很低了,想来当时的面试官是想这样考我的。。

Python开发中的一个小细节

 
for id in id_list:
    if ooxx(id):
        id_list.remove(id)
        continue
 
这样的写法是不合适的,因为当remove掉id时,目前的指针会指向下一个元素,而continue会跳过他
所以这样的现象是,一旦remove,就会跳过下一个元素
 
可以考虑这样实现
 
for id in id_list:
    if ooxx(id):
        remove_list.append(id)
        continue
 
...
 
for id in remove_list:
    id_list.remove(id)

2011年12月8日

34c800864b5fbdf1f5bdf07880580cbc
b651e465c558f19486d04132cc5a9e99
8d52c9ba70a64c76bef1ebb2873df29d
67f8ac0ae1cd830626a3d1cfe119ba4c
e6480f95effef1cf42e0907d24efd2f9
cb6d1732acec16d0a446b3ec3b948238
48c97b6ace6e545426bab8995aa21937
0a
由SMS4算法加密。