假如重新設計「驗證碼」,應該如何設計?
驗證碼多少都總會讓人覺得有點麻煩,
現在假設驗證碼還沒有被發明, 而你要發明一種可以區分機器和人類的驗證方法, 你會如何設計? 最好應盡量避免被識別技術破解。
這種問題讓人哭笑不得。
這個問題暗含的邏輯是,驗證碼是一個很糟糕的設計,但是大家都習慣了所以也沒辦法就這樣了。
拜託!驗證碼的確是一個糟糕的設計,但現在沒有任何習慣的因素導致它如此流行好不?
導致其流行的因素,都是他的優點:
例如實現簡單方便,低成本解決方案。
例如操作簡單方便,沒有學習成本。所以在當前的技術局限下,無論再發明多少次,驗證碼還會是這個鳥樣子!
如果真的有另外一個兼具驗證碼優點,而又沒有這些缺點的方案,早就流行開了。
驗證碼每天都在重新設計,你沒看到是因為那些方案都比現在的更不靠譜而已,,,,首先,不要考慮判斷滑鼠軌跡或者鍵盤敲擊,因為在pc上只要是人的動作,後台程序都可以完美模擬出來。
其次,我們要解決的問題在某種角度有點類似於上飛機前的安檢-為了確保安全,採取一刀切的態度,首先懷疑一切,然後讓用戶自己證明清白。而用戶之所以反感,原因是增加了他們的交互成本。
所以我們應該考慮的是把這個額外的交互成本變得優雅起來。
我能夠想到的是:
1. 放棄鍵盤輸入,改用滑鼠驗證。因為大多數時間裡用戶的手是在滑鼠上的,所以通過滑鼠來完成驗證,可以在一定程度上降低肢體疲勞負擔。 2. 驗證的方式盡量簡單,不要給用戶製造太大的識別障礙。比如提供3個不同形狀的暗色圖,要求用戶按照一定順序點亮。 3. 讓這個過程有趣起來。製造輕鬆幽默的氛圍,也能稍稍緩解用戶的反感情緒。驗證碼是一個妥協的方案,技術無法識別人,只能讓人干一些愚蠢的事情。
我們應該跳出修正驗證碼方案的角度去看問題,能不能不要驗證碼或者大多數情況下不要驗證碼。
比如GMAIL,當你密碼連續錯三次以後才要驗證碼,一般都不需要驗證碼;QQ異地登錄時才需要你提供驗證碼;當然應該有更偉大的想法,總之最好不要讓用戶看到愚蠢的驗證碼~~~據說Google曾測試過一種新型的「驗證碼」,給你一張顛倒的圖片,讓你給轉到正確的方向。我覺得還是挺靠譜的,盡可以找一些相對複雜點的圖片,人類可以輕鬆識別而機器識別困難;另一方面還簡化操作,只要轉一轉方向就可以了,不用再看那些該死的扭曲的字母了。
---------補充-----------
突然想到另外一種,類似於網遊的防外掛的系統,先給你顯示一張圖片,然後在下面列出來其他幾個,讓你選擇跟上面是同一類型的東西。這個可能會好一點。但是圖片庫的量級一定要大,否則讓機器給遍歷了一次就完了。要清楚驗證碼的本質:
1、輸入的可能性非常大,就像現在的註冊碼,(26+10)^4種可能輸入,不會因為高概率而直接破解成功。像什麼轉方向啊,幾個按鈕那種就不要想了,我有1/100的概率註冊成功,我就根本不會去破解驗證碼,直接暴力好了,何必呢?2、別想著用前端技術去解決問題,前端是明文,人家直接就能看到,怎麼解析都行,一定是從rpc介面入手,而不是靠js。3、一定是很難用機器識別的智能內容。所以想來想去,其實現在的驗證碼方案其實還是蠻靠譜的。我想到一種可以替代的方案就是該用滑鼠畫畫輸入驗證碼,比如語音輸出「三國演後面那個字是什麼?」,用滑鼠畫出義才能進入。好吧,其實也挺麻煩的。有意思!我認為機器唯一無法完全理解的是人類的語言構成。這樣吧,隨機把一句通順的話中的所有字元排列順序打亂,然後讓你重新把它復原成一句通順無明顯語病的話。
如果客流量不大的話,人工驗證是最靠譜的辦法。直接語音電話聯繫,確認之後開通。
如果客流量大,那麼收費驗證也是個辦法,你可以收費很少(例如 1 元錢以內),但是這個看似很少的收費就足夠擋住大多數機器人,因為註冊一個賬號發帖最多賺5毛啊,註冊耗費 1 元然後發個廣告貼被封,就虧大了。
另外我認為邀請註冊也是一個不錯的機制,只有在這個網站成功的正式用戶,才會適當的得到幾個邀請名額。這也可以控制機器人。
一個感覺還行的方法,就是給一個圖片,其中畫了一些按鈕(有的是干擾按鈕,人眼可以識別,機器無法識別),你點擊圖片的時候,把你滑鼠位置發過去,伺服器端判斷是否在正確的按鈕內部。
註冊先付100押金,發1帖扣10塊。
我來說說我的想法。
驗證碼設計的初衷是為了驗證這個請求是否來自人類。為什麼我們要驗證某個請求是否來自人類?因為如果一個人手動惡意提交,看起來效率是很低的,於是問題來了。比如我的瀏覽器有自動填充,這個請求還是不是來自人類呢?顯然是對吧。所以,實際上驗證碼的功效,或者說起到的作用只不過是1 提高了提交的成本
2 相對降低了提交的頻率現在我有一個想法,如果我們不要人來辨別驗證碼,而選擇分派某個有一定計算量的,同時又容易驗證的計算任務分派下去,其實也是可以起到上面的要求的。
所以,我的答案是,伺服器發一個seed,讓客戶端計算一個magic值,使得hash(seed + magic)的末尾有若干個0。。對,就是xx幣設計的思路。這樣提交的頻率實際就成了對攻擊方算力的限制。。稍等,可是這樣還是可以攻擊啊!讓攻擊方幫你算xx幣!(簡直酷炫我會和廣告聯繫在一起,驗證碼的特點就是要讓用戶「努力的記憶一下」,因此可以將簡短的廣告信息放裡面,例如:公司名稱,產品名稱等等。。。
驗證碼廣告就挺好的,念一段廣告詞什麼的。更重要的是可以賺錢。
情感識別,給五個QQ表情,選擇一個符合條件的。
關於驗證碼,這裡有一篇驗證碼發明人的論述:[TED][中英字幕]2011路易斯?范?安:大型在線共同創作視頻
發言人路易斯?范?安現在在嘗試著用人驗證碼來幫助辨識掃描版本的電子圖書(一般是古籍,字比較難認)。
其實驗證碼的本質就是一個圖靈測試(比較低級的圖靈測試),目前的驗證碼越來越難看就是人類與機器對抗的一個縮影。到以後,一定會有更多更複雜的驗證碼產生的。
另外,關於驗證碼做出貢獻的問題,除了圖書電子化我覺得能想到的點子很多,例如國內現在很多創業者在做的把驗證碼變成廣告:我覺得其實讓驗證碼有趣而有用起來的方法很多,例如可以幫助人類基因組計劃找到一些比較特殊的DNA,或者醫學上特殊組織的辨識,還有 Facebook 在用驗證碼來做翻譯字詞資料庫,美國一個創業公司在做的驗證碼背單詞,翻譯句子等等,花樣很多了。
在滑鼠左鍵加指紋識別
哈~給出一堆人的照片,然後提問,比如有幾個男的幾個女的,比如有幾個人穿裙子,比如有幾個黑人幾個白人,比如有幾個大人幾個小孩……哎,太容易了!
越看越覺得我這個主意好!在這裡聲明版權歸我所有,如果有人要用的話必須得到我本人授權!哈哈哈哈哈~~~
降低用戶辨識和輸入的成本,同時防範spam,最好的方法是利用人的情感判斷。幾個例子:
- 圖中有三個人,請選出年齡最大的一個;
- 那張圖片會讓人最厭惡;
- 選擇不同類別的圖片,比如四個動物和一個人、3隻貓配一隻狗;
我覺得,如果,對於用戶來說,驗證碼是有意義的那就很棒了:
1。提供資訊的驗證碼:這種資訊可以是一句話新聞,或者一句話小百科,那麼它對用戶就是有意義的了,增長了用戶的知識。這句話呢就按照傳統的驗證碼那樣把這句話的每個字都扭曲一下,但是,其中某兩個字的顏色不同,而用戶需要輸入的就是這兩個字。這意味著,同一句話,可以成為不同的驗證設置。
2。或者是,對社會有益的東西:當我第一次看到recaptcha的時候,我超級激動,我完全被這個點子震撼了,居然我在輸入驗證碼的同時在幫助數字化書籍。而我想的對社會有益的設計會簡單點:不要驗證碼,需要支付寶支付五角錢,我承諾這些錢用於公益。這樣,只要限制單個賬號在固定時段內的支付次數,就減少spam了,而我呢就想個和recaptcha類似的廣告吧:stop spam, care more about the society.當然,這好像把預防spam的壓力轉移給了支付寶。
只要是想在提交動作上驗證,就可以被機器模擬。
還是那句話,你能區分出和你聊天的是一隻狗么?所以只能在內容上下功夫了。
樓上的 很多同學,只要成功概率高於百分之一,機器就可以利用。驗證碼的存在是沒有必要的,因為用戶並不需要,但是作為放置惡性註冊,就要找一個好一點的方式。個人不懂技術,但還是可以聊聊。 開發一個類似現在流量器的滑鼠手勢,驗證碼就是一個軌跡,然後照著軌跡滑鼠手勢一下就ok啦。 好處在於: 1. 不用點擊輸入框,即可直接右鍵完成。 2. 比起數字什麼的,不用調用輸入法等其他程序 3. 比英文數字漢字更國際化,只要會用滑鼠的就能完成。
歡迎拍磚,討論,個人覺得還是挺靠譜的。
推薦閱讀:
※要不要讀東大計算機專攻研究生?
※在不同地點的人是否可能有相同的 IP 地址?
※如何假裝自己是一個AI?
※能否寫出一個能根據自我需要而進行編程的程序?