如何防止被惡意刷接口?
前言
在面試時,經常會被問一個問題:如何防止別人惡意刷接口?
這是一個非常有意思的問題,防范措施挺多的。今天這篇文章專門跟大家一起聊聊,希望對你會有所幫助。
圖片
1 防火墻
防火墻是網絡安全中最基本的安全設備之一,主要用于防止未經授權的網絡訪問和攻擊。
防火墻可以防止的攻擊行為包括:
- 無效數據包:防火墻可以識別和過濾掉無效的數據包,如錯誤的 IP 地址、偽造的數據包和無法識別的協議等。
- DOS 和 DDOS 攻擊:防火墻可以使用不同的技術來檢測和阻止 DOS 和 DDOS 攻擊,如阻止大量 TCP/UDP 連接、IP 地址過濾和流量限制等。
- 病毒和蠕蟲攻擊:防火墻可以使用特定的病毒和蠕蟲檢測技術,如簽名檢測、行為檢測、模式識別等,來防止這些惡意軟件的傳播。
- 網絡釣魚和欺騙攻擊:防火墻可以檢測和防止網絡釣魚和欺騙攻擊,如防止虛假登錄頁面和欺騙的網站等。
- 惡意流量攻擊:防火墻可以檢測和防止惡意流量攻擊,如過濾掉帶有惡意載荷的數據包和防止被黑客利用的端口。
- 網絡偵察攻擊:防火墻可以使用一些技術來防止網絡偵察攻擊,如防止掃描、端口掃描和漏洞利用等。
防火墻主要用于過濾和控制網絡流量,以保護網絡安全。
2 驗證碼
對于一些非常重要的接口,在做接口設計的時候,要考慮惡意用戶刷接口的情況。
最早的用戶注冊接口,是需要用圖形驗證碼校驗的,比如下面這樣的:
圖片
用戶只需要輸入:賬號名稱、密碼和驗證碼即可,完成注冊。
其中賬號名稱作為用戶的唯一標識。
但有些圖形驗證碼比較簡單,很容易被一些暴力破解工具破解。
由此,要給圖形驗證碼增加難道,增加一些干擾項,增加暴力破解工具的難道。
但有個問題是:如果圖形驗證碼太復雜了,會對正常用戶使用造成一點的困擾,增加了用戶注冊的成本,讓用戶注冊功能的效果會大打折扣。
因此,僅靠圖形驗證碼,防止用戶注冊接口被刷,難道太大了。
后來,又出現了一種移動滑塊形式的圖形驗證方式,安全性更高。
圖片
此外,使用驗證碼比較多的地方是發手機短信的功能。
發手機短信的功能,一般是購買的云服務廠商的短信服務,按次收費,比如:發一條短信0.1元。
如果發送短信的接口,不做限制,被用戶惡意調用,可能會產生非常昂貴的費用。
3 鑒權
對于有些查看對外的API接口,需要用戶登錄之后,才能訪問。
這種情況就需要校驗登錄了。
可以從當前用戶上下文中獲取用戶信息,校驗用戶是否登錄。
如果用戶登錄了,當前用戶上下文中該用戶的信息不為空。
否則,如果用戶沒登錄,則當前用戶上下文中該用戶的信息為空。
對于有些重要的接口,比如訂單審核接口,只有擁有訂單審核權限的運營賬號,才有權限訪問該接口。
我們需要對該接口做功能權限控制。
可以自定義一個權限注解,在注解上可以添加權限點。
在網關層有個攔截器,會根據當前請求的用戶的權限,去跟請求的接口的權限做匹配,只有匹配上次允許訪問該接口。
4 IP白名單
對于有些非常重要的基礎性的接口,比如:會員系統的開通會員接口,業務系統可能會調用該接口開通會員。
會員系統為了安全性考慮,在設計開通會員接口的時候,可能會加一個ip白名單,對非法的服務器請求進行攔截。
這個ip白名單前期可以做成一個Apollo配置,可以動態生效。
如果后期ip數量多了的話,可以直接保存到數據庫。
只有ip在白名單中的那些服務器,才允許調用開通會員接口。
這樣即使開通會員接口地址和請求參數被泄露了,調用者的ip不在白名單上,請求開通會員接口會直接失敗。
除非調用者登錄到了某一個白名單ip的對應的服務器,這種情況極少,因為一般運維會設置對訪問器訪問的防火墻。
當然如果用了Fegin這種走內部域名的方式訪問接口,可以不用設置ip白名單,內部域名只有在公司的內部服務器之間訪問,外面的用戶根本訪問不了。
但對于一些第三方平臺的接口,他們更多的是通過設置ip白名單的方式保證接口的安全性。
5 數據加密
以前很多接口使用的是HTTP(HyperText Transport Protocol,即超文本傳輸協議)協議,它用于傳輸客戶端和服務器端的數據。
雖說HTTP使用很簡單也很方便,但卻存在以下3個致命問題:
使用明文通訊,內容容易被竊聽。不驗證通訊方的真實身份,容易遭到偽裝。無法證明報文的完整性,報文很容易被篡改。為了解決HTTP協議的這些問題,出現了HTTPS協議。
HTTPS協議是在HTTP協議的基礎上,添加了加密機制:
SSL:它是Secure Socket Layer的縮寫, 表示安全套接層。TLS:它是Transport Layer Security的縮寫,表示傳輸層安全。HTTPS = HTTP + 加密 + 認證 + 完整性保護。
為了安全性考慮,我們的接口如果能使用HTTPS協議,盡量少使用HTTP協議。
如果你訪問過一些大廠的網站,會發現他們提供的接口,都是使用的HTTPS協議。
6 限流
之前提到的發送短信接口,只校驗驗證碼還不夠,還需要對用戶請求做限流。
從頁面上的驗證碼,只能限制當前頁面的不能重復發短信,但如果用戶刷新了頁面,也可以重新發短信。
因此非常有必要在服務端,即:發送短信接口做限制。
我們可以增加一張短信發送表。
該表包含:id、短信類型、短信內容、手機號、發送時間等字段。
圖片
有用戶發送短信請求過來時:
先查詢該手機號最近一次發送短信的記錄 如果沒有發送過,則發送短信。如果該手機號已經發送過短信,但發送時間跟當前時間比超過了60秒,則重新發送一條新的短信。如果發送時間跟當前時間比沒超過60秒,則直接提示用戶操作太頻繁,請稍后重試。這樣就能非常有效的防止惡意用戶刷短信的行為。
但還是有漏洞。
比如:用戶知道在60秒以內,是沒法重復發短信的。他有個程序,剛好每隔60秒發一條短信。
這樣1個手機號在一天內可以發:60*24 = 1440 條短信。
如果他有100個手機號,那么一天也可以刷你很多條短信。
由此,還需要限制每天同一個手機號可以發的短信次數。
其實可以用redis來做。
用戶發短信之后,在redis中保存一條記錄,key是手機號,value是發短信的次數,過期時間是24小時。
這樣在發送短信之前,要先查詢一下,當天發送短信的次數是否超過10次(假設同一個手機號一天最多允許發10條短信)。
如果超過10次,則直接提示用戶操作太頻繁,請稍后重試。
如果沒超過10次,則發送短信,并且把redis中該手機號對應的value值加1。
短信發送接口完整的校驗流程如下:
圖片
7 監控
為了防止被別人惡意刷接口,對接口的調用情況進行監控,是非常有必要的。
我們的程序中可以將用戶的請求記錄,打印到相關日志中。
然后有專門的程序,統計用戶接口的調用情況,如果發現有突增的流量,會自動發短信或者郵件提醒。
有了監控之后,我們可以及時發現異常的用戶請求。
后面可以進行人工干預處理。
8 網關
為了保證我們接口的安全性,可以提供統一的API網關,它可以實現過濾、鑒權、限流等功能。
用戶請求我們的API接口時,需要先經過API網關,它轉發請求到具體的API接口。
圖片
有了API網關層,可以保護API接口。