網站如何區分人為的輸入還是自動化程式的輸入
這篇文章主要說明網站遇到一個受到自動化程式的問題。
想像醫院的網站掛號系統,
有黃牛利用自動化程式自動的掛號,將所有的號碼都拿走。
在其它的市場高價販賣掛號號碼,
因此對於這樣的網站掛號系統來說,必須要如何區分是”人”掛號還是”機器”掛號?
如何盡量降低”機器”掛號的可能性? 就是這篇文章要討範圍。
電腦自動化的方式
在說明網站如何偵測與避免機器人掛號行為之前,讓我們看看幾種電腦自動化操作的工具與優缺點。
1. Selenium
情境:
這種的自動化操作是最接近人操作的一種。因為Selenium啟動瀏覽器之後,模擬所有人的按鍵點擊。
如何找到網頁原件:主要透過HTML 中的 ID, Name 與 XPath
限制:
Windows native UI 或是圖片式的按鈕。當然對駭客來說可以用其他輔助工具解決這樣的問題。
如何防護這類的自動化?
可以將 HTML ID, Name 變成動態的亂數。
原本 <input class=”gsfi” id=”lst-ib” maxlength=”2048″ name=”q” autocomplete=”off”>
建議為 <input class=”gsfi” id=”lst-ib” maxlength=”2048″ name=”q_123112353asdfd” autocomplete=”off”>
這樣可以徹底防護嗎? 其實不行的。因為駭客原本用 name = “q”定位。
之後可以用 class = “gsfi” And id = “lst-ib” 定位。我們不可能把所有的 HTML tag都變成亂數。
2. Web Http Request/Response
情境:
不啟動瀏覽器,直接傳送 Http Request GET/Post
優點:
快速。不會受到瀏覽器啟動或是網頁下載速度的影響。
缺點:
與瀏覽器的行為還是有很大差異。
如何防護這類的自動化?
1. User Agent的判別。瀏覽器會有定義已知的 User Agent。
但是如果是程式撰寫的傳送 Http GET/POST”,因為駭客忘記定義,所以可能”會沒有。
因此這種判斷方式無法阻擋高端駭客。
2. 在網頁中加入 Random Token,例如
<input type= hidden value=123lkjslefjalsdkfj;la>
由於每次的 Http Response 網站都必須要驗證這個Random Hidden value 是否發出與回收的相同,
因此會讓駭客刻意製造出的 Http Request 更加困難。
當然,駭客因此不採用這個方法,而用上述的 Selenium 或是接下來要討論的 Sikuli
3. GUI Sikuli
情境: 用看到的電腦圖片做自動化操作。
優點: “看”到什麼就點擊什麼。例如:
駭客黃牛用哪一種? 以上3 種混合! 另外加上雲端的 OCR辨識。https://2captcha.com/
目前網站防護的機制討論
這些機制的困難在於如何再引進相關偵測”機器”程式的同時又保持使用操作的容易度。
基本的原理是過程中讓使用者輸入一些非固定的答案。例如:亂數圖片、數字運算、使用者的個人偏好等。
1. Re-captcha (筆者建議)
傳統的 CaptCha常常需要使用者打幾乎人也分辨不出的文字,
相信大家都有這樣的經驗,打了好幾次都不通過,最後有可能就放棄,
使用者經驗不好的 Captcha,為了打擊自動程式黃牛,反而會造成使用者流失,間接懲罰忠實的使用者。
Google 推出新一代的 Re-Captcha服務。
https://www.google.com/recaptcha/api2/demo
http://patrickhlauke.github.io/recaptcha/
第一層驗證
原則上使用者只需要點選這個 CheckBox 即可,如果雲端分析該使用者有可能是機器時,就會出現第二層驗證
這個CheckBox 駭客可以用 Selenium點選嗎? 很難。
筆者測試,因為這個 CheckBox 在一個 random的 iFrame中,而且 ID也是 Random是一個虛擬的圖片不是CheckBox
那麼這個CheckBox駭客可以用 Sikuli點選嗎? 可以的。輕而易舉
駭客可以用 Sikuli 直接用途行比對點選該方框即可。但是雲端”有可能”會分析出使用者行為為電腦而出現第二層驗證
第二層驗證
這樣的驗證自動化程式或是OCR 就很難處理。一來圖片位子都是亂數,二來每次的問題都很不同。
選取含有派的。選取還有地址的。選取還有水流的等等。這樣的辨識短期內對於自動化程式來說有一定的難度。
2. Captcha (使用者辨識困難)
這個是常見的 CAPTCHA 缺點是有些顯式也讓使用者很難辨識。
駭客可以使用一些雲端的服務或是 OCR 就可以輕易的進行自動化破解。
3. 移動按鈕 (對駭客完全無效)
另外一個常見的是移動是 “登入”按鈕,下列圖形”登入”按鈕位置每次都會不同,
這樣的移動式按鈕對駭客有阻擋的效果嗎?
筆者測試,對駭客完全無效。
可以用 Selenium Xpath 定位,不管該按鈕的位置如何,都可以點選。
可以用 Sikuli 定位,針對該按鈕登入的綠色特徵圖片點選,也可以輕鬆點擊。
因此這個方式,對駭客自動程式完全無效。
4. 多頁式的登入驗證方式
這是另一個常見的方式,透過多頁認證的方式。例如,Bank of America 就是這樣的做法。
第一頁 | 第二頁 | 第三頁 |
輸入 ID | 輸入隨機問題例如使用者個人偏好?例如隨機的數字運算 5 + 1 = ?這之中網頁的 ID or Name 也會定期隨機更換 | 輸入使用者認證密碼或是手機認證訊息 |
5. Hidden Input(容易誤判)
Hidden的欄位可以讓使用者看不到,但是程式不一定會知道。因此如果這個欄位還是有值回填的話表示就是電腦自動程式完成。
為什麼容易誤判呢? 因為一般瀏覽器有 Auto form fill 的功能,也可有可能將該欄位自動回填。
7. 數字運算
另外一種方式就是提供簡單的數學運算,例如下列各種組合。
可以阻擋駭客嗎? 有限。因為駭客可以用 Selenium 將該文字取出之後分析,計算出答案。
94+4=40 加 8 等於31+7= |
7. 手機簡訊認證
利用 Two Factor authentication
網站要進一步交易前,傳送一組亂碼簡訊至使用者手機,
網站要求使用者必須要輸入手機上的號碼後,才能夠繼續下一步的交易
由於需要兩階段手機的認證,也會讓許多自動化測試無法完成。
缺點是:這樣的認證服務需要產生額外的費用。
筆者推薦
魔高一尺,道高一丈。
對駭客來說:沒有不能夠自動化的系統。
對安全業者來說:設計最安全的防護
相信這樣的技術會不斷的發展下去,
如果設計要兼顧使用者使用經驗與防護的較果,以目前已知的方式下,筆者最為推薦”visualCaptcha”
0. VisualCaptcha
這個服務免費,又可以在自己的網站系統建立。使用者經驗也比較好。
例如下列範例。使用者根據文字描述,點選正確對應的圖案。
對於使用者來說,比起常需要打複雜的 Captcha 又很難辨識的圖案,使用者經驗要好很多。
另外,對於網站系統管理來說,該系統後台可以自己建立安裝,
圖案與文字的對應關係建立又相對容易,可以定期更換或是大量的建立對應關係。
http://demo.visualcaptcha.net/
1. Re-captcha
推薦,但是前提是該服務必須要可以連到 Google後端平台
2. 手機簡訊認證
推薦,但是前提手機簡訊如果遺漏或是手機簡訊費用的問題