當前位置: 妍妍網 > 碼農

如何防止被惡意刷介面?

2024-04-27碼農

架構師(JiaGouX)

我們都是架構師!
架構未來,你來不來?


前言

在面試時,經常會被問一個問題:如何防止別人惡意刷介面?

這是一個非常有意思的問題,防範措施挺多的。今天這篇文章專門跟大家一起聊聊,希望對你會有所幫助。


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介面。


    如喜歡本文,請點選右上角,把文章分享到朋友圈
    如有想了解學習的技術點,請留言給若飛安排分享

    因公眾號更改推播規則,請點「在看」並加「星標」 第一時間獲取精彩技術分享

    ·END·

    相關閱讀:

    作者:蘇三

    來源:蘇三說技術

    版權申明:內容來源網路,僅供學習研究,版權歸原創者所有。如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝!

    架構師

    我們都是架構師!

    關註 架構師(JiaGouX),添加「星標」

    獲取每天技術幹貨,一起成為牛逼架構師

    技術群請 加若飛: 1321113940 進架構師群

    投稿、合作、版權等信箱: [email protected]