今天是2015年的12月17日,距離2016年的春節(jié)還有1個多月,一年一度的春運高峰又要來了。在大家趕著回家過年的時候,大名鼎鼎的12306又被推上了風(fēng)口浪尖。最早是以前的網(wǎng)絡(luò)擁堵,系統(tǒng)卡、慢,然后是刷票軟件,網(wǎng)絡(luò)黃牛,到今年,出現(xiàn)了史上最奇葩的圖片驗證碼。
之前有新聞稱,12306驗證碼的一次成功輸入率僅為8%,而每天刷票的黃牛,反而術(shù)業(yè)專攻,熟能生巧,練就了一副火眼金睛,他們?nèi)斯に⑵钡乃俣缺绕胀ㄙ徠闭呖焐狭藥资丁?/p>
作為一名網(wǎng)站開發(fā)人員,為了一探究竟,我親自打開了12306網(wǎng)站,僅僅5分鐘,就發(fā)現(xiàn)了一些問題,然后有很多想法,于是動手寫這篇文章。重點就是這個圖片驗證碼。
圖1 登錄界面
下面這張圖,雖然是網(wǎng)民惡搞,但是也能反映出網(wǎng)民對著那些模棱兩可又小又模糊的驗證碼時焦急而又無從判斷的心情。
網(wǎng)民惡搞圖,但是反映的問題是一樣的
當(dāng)?shù)卿洉r出現(xiàn)這個圖片驗證碼,鼠標(biāo)在驗證圖片右鍵,可以查看屬性,于是就獲得這個圖片的地址:https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand 這是去掉了隨機數(shù)的一個地址。輸入這個地址,就能打開單獨的圖片并且包含了問題,而且只需要刷新網(wǎng)頁,就能隨機展現(xiàn)更多的圖片和問題,如下圖:
圖2 12306的圖片模式
這其實是一個很致命的問題,很多所謂的搶票軟件,刷票瀏覽器,就能把這個作為收集問題和圖片的手段。讓一個工作人員,不斷的刷新這個地址,然后將他看到的問題關(guān)鍵詞錄入數(shù)據(jù)庫,比如“雕像”、“帳篷”、“訂書機”。這是第一步,然后,我通過連續(xù)刷新圖片觀察到,每次刷新的8張圖片,它們的排列坐標(biāo)都是一致的,且相同圖片再次出現(xiàn)的時候,圖片主體完全相同。這樣刷票軟件開發(fā)者只需要在固定坐標(biāo)采集像素屬性,就能夠?qū)D片識別出來,我15年前就用VB6.0寫了游戲?qū)ε龅耐鈷臁F湓砣缦?/p>
上圖假設(shè)為一個需要識別的圖片,仔細看,上面我點了9個點(人工點的,有點歪),這9個點相對與這個圖片,是固定的坐標(biāo),通過編寫程序?qū)崿F(xiàn)采集圖片固定坐標(biāo)的像素屬性是很簡單的。然后上圖就能得出“白、白、白、紅、紅、白、白、蘭、白”這9個點的顏色(實際上應(yīng)該是更加精確的顏色,比如RGB,這里只為了表述方便)。而這個圖片對應(yīng)的問題可能是“請選擇下面所有陽光太倉人才網(wǎng)的logo”,于是,我們把“陽光太倉人才網(wǎng)”和“白、白、白、紅、紅、白、白、蘭、白”存入數(shù)據(jù)庫。這就是一條識別數(shù)據(jù),然后繼續(xù)通過刷新上面的地址,獲取更多的信息資源。實際上采集坐標(biāo)像素屬性的代價很小,我這里舉例9個點,其實完全可以采集更多,比如9*9=81點,12306的圖片每張圖片似乎加入了1-5個干擾點,但是比如采集81個點,只要75個以上匹配數(shù)據(jù)庫里的記錄,基本上就能判斷了。
等這些數(shù)據(jù)資源獲取得差不多了,那么每個圖片是代表什么東西,程序都可以自動通過重新采集指定坐標(biāo)的屬性來判斷圖片的內(nèi)容了。當(dāng)這8張圖總是尺寸固定,位置固定的時候,就能一次性判定8張圖片的內(nèi)容了。而后再通過類似的漢字識別技術(shù),可以在固定的區(qū)域識別12306提出的問題。因為在(圖2)中,我們看到,提出的問題居然和圖片是捆綁在一起的,且問題文字被固定在圖片頂端相同的位置。
僅僅是試用5分鐘,登錄了12306,就發(fā)現(xiàn)了這幾個問題,而且這幾個問題解決起來非常簡單。
1、對驗證圖片的調(diào)用需要授權(quán)。
比如,網(wǎng)站的登錄頁面是“https://kyfw.12306.cn/otn/login/init”這個地址,在這個地址調(diào)用驗證圖片時,可以在調(diào)用的url后面增加授權(quán)碼,授權(quán)碼可以是通過將一個密鑰進過md5或者sha轉(zhuǎn)換后的字串,同時結(jié)合http Referer,杜絕將驗證碼圖片被直接從其他地方打開的可能,這樣一些編寫的刷票軟件,就不方便直接調(diào)用 https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand 這個地址來收集樣本了。
2、圖片的簡單變換。
很簡單,把現(xiàn)在的每一副圖片,通過改變上下左右的邊距,在圖片外框尺寸不變的情況下,核心內(nèi)容出現(xiàn)偏移,這樣就能打亂像素的坐標(biāo),且這個偏移是隨機范圍的。比如下圖:
這樣的圖片依然能被人識別內(nèi)容,但是通過固定坐標(biāo)采集,就很難比對了(其實可以通過密集采集,然后按序比對,找出公共序列的方法來比對,但是復(fù)雜很多)
3、把問題和圖片分離
把問題和8個答案圖片放在一起展示,是問題的根源之一,是給了搶票軟件分析圖片采樣數(shù)據(jù)的機會。如果把問題分離出來,且采用上述1、的方法,那么就很難采樣問題和答案圖片了。
最后,我目前只是圍繞圖片驗證碼來看待問題,其實,反刷票,反搶票的方法還有很多,我可以肯定,如果鐵道部請我去設(shè)計,一定可以完美解決。比如通過綁定手機號碼,限時限量購票等,這些是技術(shù)層面的。
另外從策略層面,可以將購票接口開放到淘寶、微信。鐵道部為什么不這樣做?壟斷!高達數(shù)億元人民幣以上的升級開發(fā)費用,為何與各種不可理喻的購票流程和糟糕的體驗之間,存在如此巨大的反差。這究竟是一樁何等艱難的生意,需要鐵道部獨自堅守?
不對外授權(quán),不開放插件,表面上是營造公平,但是恰恰是最大的不公平。好比國家發(fā)行的紙幣,防偽能力差,最終獲益的是那些非法制造假幣的犯罪分子,而受害的是老百姓。2013年搶票插件興起,獵豹、360被鐵道部約談,360董事長周鴻祎曾撰文表示,技術(shù)一直在推動建設(shè)一個高效的公平社會,搶票插件是讓一部分人利用這個高效工具,是一種積極意義的不平等,促使更多人使用搶票插件,省去手工操作、排隊買票的時間,提高整個社會效率。周鴻祎的觀點不錯,正規(guī)廠商開發(fā)的搶票插件被禁止,但是并不表示所有人都不能搶票了,在我的朋友圈里,能寫搶票程序的就不在少數(shù),更別說那些形成利益鏈的黃牛組織了。
淘寶、QQ等在全國有那么豐厚的硬件和網(wǎng)絡(luò)資源,完全可以承擔(dān)春運售票的網(wǎng)絡(luò)業(yè)務(wù)壓力,鐵道部只需要建立一個車票的核心數(shù)據(jù)庫,通過接口將售票業(yè)務(wù)放出去,這是最好的方案,為什么還要把這個吃力不討好的業(yè)務(wù)抓在手里?
政府機構(gòu)不會倒閉,不會破產(chǎn),一旦壟斷了,只要臉皮厚,或者干脆不要臉了,就能一直壟斷下去!壟斷的背后一定有利益的支撐,這個利益恐怕強大到足以讓某些機構(gòu)厚著臉皮挨罵!而政府機構(gòu)不盈利,盈利的是誰呢?或者說賺取的不是金錢,是權(quán)力?需要深究!