【探索】自動報警的驗證碼
前言
最近 12306 換了套新驗證碼,又一次引發吐槽。
雖然圖片組合的方式仍有不少爭議,但無論如何能嘗試突破傳統,都是值得稱讚的。
畢竟傳統的驗證碼已飽受詬病了。為了對抗少數惡意使用者,卻降低了絕大部分正常人的使用者體驗。
每當無聊時,就會遐想各種驗證碼的方案,今天分享一個比較有趣的。
自動報警的密碼
曾有傳言,在 ATM 機上密碼倒著輸會自動報警。且不論真實性,就這想法還是有點意思的。
首先,也是最重要的,輸入了這個反密碼仍能取錢,這滿足了劫匪的目的。但同時已悄悄的報警,想必也逃不遠了。
其次,這無需引入一個額外的報警密碼。多一個就會提升複雜度,增加記錯的可能。
最後,即使平時輸錯,那麼正好輸成這個報警碼的概率也是很低的。(12321 這種迴文暫不考慮)
於是密碼除了可以用於驗證外,還可以在真與假之間建立一個規則,用於隱寫額外的資訊。
這個特徵,是否也可用於驗證碼呢。
自動報警的驗證碼
我們得設計一個圈套,讓正常使用者幾乎不會落入,而假人一不小心就會掉進這個陷阱裡。
通常情況下,破解驗證碼的程式都是直接抓取圖片中的畫素點,然後進行分析。而使用者看到的,則是螢幕上最終顯示出來的內容。
在絕大多數情況下,這兩者都是相同的。但我們也可以讓它變得不同,人為的製造一點麻煩出來。
例如,一個內容為 d6xm 的驗證碼:
這是個再普通不過的驗證碼,破解幾乎毫無壓力。不過,這次玩的不再是演算法上的對抗了。
我們在頁面中某個隱蔽的地方,偷偷插入一個 CSS 規則:
.captcha { transform: rotate(180deg) }
將圖片進行 180° 的旋轉。這時,呈現在使用者眼前的就是這樣一個東西了:
內容正好變成了 wx9p!
到底哪個是正確答案呢,就不用說了吧。既然我們考察的是使用者,那當然就是眼見為實的了!
但通過抓圖識別的假人看來,仍是原始的畫素點,並不知道頁面中還有這麼個小把戲,於是一不小心就中招了。
即使使用者偶爾會有輸錯,但如果能把 wx9p 拼成 d6xm,那也太巧合了,想必還是開掛的可能性比較大吧。
類似輸入報警密碼仍能取錢,我們也儘量保持這個陷阱足夠低調。即使使用者提交了 d6xm 也算通過,但後臺會悄悄的記錄下這一切。
當某個使用者達到一定可疑程度時,就可以對其採取相應的措施了。將攔截處理進行延時,以避免過早的進入對抗。
題庫模板
當然,上面只是舉了個簡單的例子。像旋轉這樣的規則,有著太多的侷限。並非所有字元旋轉後都有對應的,也不能出現迴文字串。
事實上,還可以嘗試更為通用的方法。
前面提到 ATM 取款密碼時,若能單獨設定一個報警密碼,其實也是很好的,只是要多記一條。但在驗證碼這裡,使用者是完全透明的,再複雜也是瀏覽器自動搞定的。
我們嘗試在圖片裡寫入兩套字串。一個非常明顯,另個則像水印一樣暗淡。
正常情況下,後者不仔細觀察很難發現。但通過頁面中的濾鏡,會使兩者正好相反:
於是在終端使用者眼裡,看見的反而是水印的版本。
除了這些,其實有無數多的變化方案。例如事先對圖片進行扭曲,渲染時再還原回來,等等。
當然不論怎樣,其本質都是一樣的。相比傳統的單一影象輸出,如今還多一個變幻引數,並且位於圖片之外的頁面裡。兩者必須相結合,才能渲染出最終的影象。
對於普通的傻瓜式破解程式,這道門檻即可將其原形畢露。為了獲得圖片最終被應用上的樣式,外掛不得不使用瀏覽器核心對頁面進行渲染,取代傳統直接抓介面的方式。
於是進入前端指令碼對抗階段。
對抗
對抗是沒有標準答案的。如果要有,那就是成本最低的,才能堅持的更久。
傳統的驗證碼出現十多年,已經積累了大量的破解經驗,現成的工具和演算法隨處可得,影象識別進入低成本規模化。在這樣形勢下,還停留在純粹的影象上,也難以大幅改進了。
但新增了一個渲染時的變數,情況就變得好轉。我們可以使用前端加密混淆技術、以及各種黑魔法,進行對抗。
也許某個外掛在識圖領域非常強,但對於頁面指令碼的瞭解並不深入。於是,我們就可使用另一個自己熟悉的領域,和傳統進行對抗了。
當然,最完美的驗證碼,就是沒有驗證碼,讓頁面指令碼來進行自我檢驗。可以參考:《對抗假人 —— 前後端結合的 WAF》。在過去前端技術尚不發達的年代,這套系統無需驗證碼也能抵擋絕大多數的惡意提交和 cc 攻擊。 在如今,比的就是更巧妙的方案了。
無論怎樣,總是可以有更低成本的綜合方案,來解決實際問題,而非吊死在一棵樹上。
懲罰
外掛是永遠不會消失的,而且只會越來越先進。我們不能阻止武器的製造者,但能懲罰濫用的人。
任何一個方案都會被破解,是無法長期對抗的。但可以在它的有效期內,儘可能多的揪出開掛使用者,並作出懲罰。尤其是實名制的賬號,逮到一個就少一個。
這種方案也未免每次都開啟,而是時不時的進行抽查,讓使用者在使用外掛的具有一定的畏懼性,才是最終目標,
相關推薦
【探索】自動報警的驗證碼
前言 最近 12306 換了套新驗證碼,又一次引發吐槽。 雖然圖片組合的方式仍有不少爭議,但無論如何能嘗試突破傳統,都是值得稱讚的。 畢竟傳統的驗證碼已飽受詬病了。為了對抗少數惡意使用者,卻降低了絕大部分正常人的使用者體驗。 每當無聊時,就會遐想各種驗證碼的方案,今天分享一個比較有趣的。 自動報警的密碼 曾有
【5】GDI+ 生成驗證碼
splay 小應用 eric gen 前景 num 微軟 param graphic 這裏我們做一個小應用,就是繪制一個如下圖所示的驗證碼圖片。並且點擊驗證碼的時候會自動切換。 實現思路如下: 通過Random生成隨機數或字符及驗證碼 通過驗證碼內容長度生成指定大小的圖
【精華】PHP網站驗證碼不顯示的終結解決方案
brief 重新 pad enter 批量 list 展開 href lis PHP網站驗證碼不顯示,這個是個很基礎的PHP問題了,不過有點時候會比較讓開發者比較頭疼了。很多解決方案僅僅考慮到gd2,卻忽略了另外一個很重要的因素了,相信在了解本教程之後,驗證碼不顯示
【Python】短信驗證碼平臺查詢賬戶余額demo---創藍253雲通訊平臺案例
epo json desc des 驗證碼 余額 其中 pconnect .com #!/usr/local/bin/python#-- coding:utf-8 -- Author: jacky Time: 14-2-22 下午11:48 Desc: 短信http接口的p
【python】帶圖片驗證碼的登入自動化實戰
近期在跟進新專案的時候,整體的業務線非常之長,會一直重複登入退出不同賬號的這個流程,所以想從登入開始實現部分的自動化。因為是B/S的架構,所以採用的是selenium的框架來實現。大致實現步驟如下: 1.環境準備 2.驗證碼爬取 3.識別方案選擇 4.影象處理和識別 5.自動化實現 一、
【2018.05.11】python3.6+selenium 知乎自動登入+驗證碼 問題
時隔這麼多年,驗證碼問題我解決了,這裡也能寫下,我就是懶得寫。哈哈 #coding = utf-8 ''' 自動登入知乎 出現了驗證碼的問題,待解決...... ''' import time from selenium import webdriver driver = w
【源碼分享】短信驗證碼功能對接CmsEasy
源碼分享 無線 設置 功能 之前 文件覆蓋 完成 系統管 版本 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/插件說明本插件系互億無線針對CmsEasy_5.6_UTF-8_201
【源碼分享】短信驗證碼如何對接 WordPressv4.0,短信插件
word www. ont wordpress 1.0 key 驗證 註冊 插件 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/插件說明本插件系互億無線針對Wordpress開發,
【源碼分享】短信驗證碼如何實現微米CMS
用戶 帳戶 登錄 article 不錯 原創 tail 發現 reg 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/插件說明本插件系互億無線針對微米CMS_V29.2版本開發,請按
【專案實戰】 使用者模組 驗證碼程式
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
【插件分享】短信驗證碼對接得推校園O2O,短信功能
步驟 提交 所有 用戶註冊 一個 插件開發 來源 鏈接 獲取驗證碼 在互億無線短信平臺找到一個插件,在這邊分享一下,有需要可以了解,比自己開發要容易很多哦。http://www.ihuyi.com/ 插件說明本插件系互億無線針對得推校園O2O短信插件開發,插件內的所有文件均
【插件分享】短信驗證碼怎麽對接PHPSHE商城系統
短信驗證碼 短信平臺 進入 follow 手機 修改 管理後臺 手機號 安裝步驟 在互億無線短信平臺找到一個插件,在這邊分享一下,有需要可以了解,比自己開發要容易很多哦。http://www.ihuyi.com/ 插件說明 本插件系互億無線針對phpsheV1.6短信插件開
【源碼分享】短信驗證碼如何對接Discuz論壇
平臺 驗證碼 http 賬號同步 用戶 進入 com follow 密碼 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/ 插件說明本插件系互億無線針對DsMall_v2017120
【專案實戰】 使用者模組 驗證碼程式
伴著元旦的腳步,小編的專案跟隨著冬的腳步,馬不停蹄,小夥伴們都有這樣的經驗,在註冊某個頁面的時候,或者輸入了好幾次密碼,但是都沒有輸對的時候,這個時候,需要輸入驗證碼,那時年少,覺得,註冊個網頁為什麼還要輸入驗證碼呢,不是多此一舉嘛,然後隨著學習和專案實戰的深入,逐漸認識到,驗證碼有著不可估量的作用。首先,小
【js例項】js傳送驗證碼後倒計時60秒
首先寫一個按鈕: <input type="button" id="btn" value="免費獲取驗證碼" onclick="settime(this)" /> 然後寫js程式碼: //定義一個60秒計時器變數 var countdo
【B/S】ASP.NET---驗證碼-生成和切換
驗證碼是什麼? 驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分使用者是計算機還是人的公共全自動程式
【Spark】DAGScheduler源代碼淺析
under 提交 title 作者 sem lis git lean access DAGScheduler DAGScheduler的主要任務是基於Stage構建DAG,決定每個任務的最佳位置 記錄哪個RDD或者Stage輸出被物化
【java】之java代碼的執行機制
() alt 分享 str clas not roc 成員 輸入 要在JVM中執行java代碼必須要編譯為class文件,JDK是如何將Java代碼編譯為class文件,這種機制通常被稱為Java源碼編譯機制。 1、JVM定義了class文件的格式,但是並沒有定義如何將ja
【js】接口實現代碼
此外 額外 const 沒有 輔助方法 通過 ces 程序 string 一、什麽是接口 接口是面向對象JavaScript程序員的工具箱中最有用的工具之一。在設計模式中提出的可重用的面向對象設計的原則之一就是“針對接口編程而不是實現編程”,即我們所說的面向接
【轉】托管代碼和非托管代碼的區別
產生 沒有 匯編代碼 cati 一行 包含 虛擬機 被調用 庫類 什麽是托管代碼(managed code)? 托管代碼是一microsoft的中間語言(IL),他主要的作用是在.NET FRAMEWORK的公共語言運行庫(CLR)執行代碼前去編譯