如何讓你的API接口更加的安全?

 

前言


作爲一名後端開發,可能你所認爲的接口設計,就是定義好以下幾大要素:

  • 接口名

  • 接口參數

  • 接口返回值

  • 接口訪問URL(包括訪問方式,GET/POST/PUT/DELETE)

  • 接口版本

 

確實沒錯,以上是接口設計的基本且必要的元素,但,它們所表達的只是一種接口API規範,安全與否,另有門道!

 

*以下所說的接口,皆指對外接口,即提供給外部訪問的接口API。

 

作爲後端開發,我們需要設計接口提供給前端訪問做數據交互。通常,我們設計的接口是否夠安全,主要體現在兩方面:

  • 如何保證數據在傳輸過程中的安全性,體現爲數據的保密性與一致性

  • 服務器如何縝密地接收並處理數據,保證不被攻擊

 

設計方案


我們可以從以下幾個方面來讓我們的接口更加的安全:

  • 數據加密

  • 數據加簽

  • 時間戳機制

  • 黑名單

  • 數據合法性校驗

  • Token機制

  • 限流訪問

其中,前兩種,我們用作數據傳輸時,保證傳輸過程的更加安全可靠;後五種,則用於服務器對數據及訪問者的縝密處理,加固自身防範。

 

數據加密

數據加密很好理解了,我們平時做的登錄操作,涉及到了最敏感的用戶名和密碼數據,如果不做數據加密,這些敏感、隱私數據隨時都有可能會泄漏,造成各種各樣的損失。而數據加密,通常有以下兩種方式:

  • 對稱加密:對稱加密即密鑰對稱,加密和解密的過程使用的密鑰是相同的。常見的對稱加密算法有DES、AES。

    優點:計算處理速度快

    缺點:由於使用加密解密使用的是相同的密鑰,密鑰本身的安全性並不是十分樂觀,只要一方泄漏,全盤皆輸。

  • 非對稱加密:非對稱加密則使用一對不同的密鑰(公鑰和私鑰)做加解密。公鑰加密,私鑰可解密;反過來,私鑰加密,公鑰可解密。但通常可不會像後者那樣幹,所謂的公鑰即對外公佈的,私鑰則自己掌管,所以公鑰加密,私鑰解密,更加安全,也更加合理。常見的非對稱加密有RSA。

    優點:安全性高

    缺點:計算處理速度慢

我們平時訪問網站時用到的https協議,即結合了對稱加密和非對稱加密的優點,在處理速度和安全方面做到了比較好的平衡,因此https相對於http更加安全,前者是做過數據加密的,攻擊者不容易進行數據窺探。

此時可能你會有疑問,我們平時所做的抓包,或者直接使用瀏覽器的調試工具進行調試時,儘管是https協議,不也照樣看到了數據明文,所謂的數據加密在哪?其實你在抓包時,看到的都是抓包軟件處理過後的數據,那麼你是否瞭解抓包軟件在拿到原始數據時做了哪些處理和操作嗎?關於這點,我打算在另外一篇文章講述,這不是本篇文章的關注點。

 

數據加簽

數據加密讓我們的數據在傳輸過程中不容易泄漏,而數據加簽則是讓我們的數據不被篡改,或者不能說不被篡改(攻擊者想要篡改數據很簡單),應該說是讓我們能夠分辨出數據是否有被篡改。

數據簽名使用比較多的算法則是我們耳熟能詳的MD5算法,數據簽名校驗基本流程如下:

對要傳輸數據的某一部分,通過MD5算法生成一段字符串,然後把這段字符串與數據一起加密傳輸;接受者拿到數據後先進行數據解密,並得到那一段字符串,然後使用MD5算法對同樣一段數據進行處理,得出的字符串如果與接受到的字符串一致,則證明數據沒有被篡改,否則就是被篡改過了。原理很簡單是吧?

 

時間戳機制

數據經過加密、加簽後,數據就比較安全了,就算被抓包也不會泄露真實數據。但是有些時候攻擊者並不關心你的數據是否真實,他可能是想惡意請求以攻擊或者騷擾我們的服務器。這種情況,可以考慮對接口API加上時間戳,即規定每次像服務器發送請求都必須帶上當前請求的時間戳,服務器則設定一個時間間隔,對於同樣一個URL請求,服務器拿到當前的時間戳與上一次的時間戳做對比,如果在設設定的時間間隔內,則認爲請求過於頻繁,屬於惡意請求,不予以處理或者返回錯誤碼響應。

 

黑名單機制

API接口做了時間戳機制後,服務器攔截了那些高頻率的相同請求,保證了服務器壓力不容易過載。但是,有些時候,我們的API接口是以正常頻率被訪問,卻接受到了很多惡意非法操作。怎樣算非法,可在服務器端自行定義,比如服務器規定,用戶登錄註冊接口的密碼參數不允許帶中文,若在短時間內,連續接受到同一個用戶(同一個IP)帶中文密碼的註冊請求,則可認定是惡意非法操作。此時可採用黑名單機制,在服務器存儲一個黑名單表,若檢測到有惡意操作用戶,則將其加入黑名單,每當用戶請求時,都先查詢黑名單,如果在在黑名單中,則不予以處理或反回錯誤碼。

 

數據合法性校驗

黑名單原則中,我們通過了參數校驗來判定用戶操作是否非法,即我們的接口要做數據合法性校驗。數據合法性校驗是每個API接口最基本的安全防護手段了,它甚至可以說成是一種應該要遵循的規範,服務器要更有效的運作,則需要過濾掉那些無效的請求,同時確保服務器上存儲的數據是有效的,比如用戶註冊,要是不做數據合法性校驗,用戶直接傳來一個空值作爲用戶名或者密碼,然後服務器直接存儲,是非常不合理也不安全的。因此,爲我們的每一個API接口定製好數據合法性規則,十分必要。

 

Token機制

有些時候,我們設計的API接口是有定製性的,即只提供給指定的用戶訪問,其他用戶均予以攔截,這種情況就可以採用token機制了。所謂的token機制理解起來跟我們平時的登錄差不多,有些操作需要在登錄之後才能請求,非登錄狀態下請求須登錄狀態的API,則直接攔截。token機制也同理,我們在服務器生成存儲一份用戶唯一身份的令牌token,然後對於特定的接口規定必須帶有有效且合法的token才允許訪問,否則攔截不予以處理。至於合法用戶如何得到token或者服務器如何分配並傳輸token,這又是另外一門說法了,本文不做講述。

 

限流機制

也有些時候,服務器接收到的請求,本來就是真實且合法用戶,同時用戶也屬於正常操作請求,但卻出現了同一個接口被頻繁請求或者同時多次請求的情況,導致服務器壓力過載,進而引起用戶響應時間長,嚴重則服務器掛掉。這種時候,我們就可以考慮採用限流機制,即限制同一時間內請求訪問的併發數。

常用的限流機制可分爲:

  • 令牌桶限流

  • 漏桶(或漏斗)限流

  • 計數器限流

 

令牌桶限流:

服務器以一定的速率向桶中放入令牌,填滿了就丟棄。請求來時先從桶中取出令牌,如果能拿到令牌,則處理請求;否則請求進入等待隊列或者拒絕處理。令牌桶允許一定程度的突發流量,只要有令牌就可以處理,支持一次拿多個令牌。

用個通俗易懂的例子在說:

你和你的朋友四個人去海底撈吃火鍋,只要足夠的位置,你們就可以立即進去就餐。但是由於海底撈比較火爆,很多人都喜歡去,且都喜歡在中午12點或者晚上7點去,這時候海底撈的位置可能很快就滿了。恰好你們去得稍微遲了點,沒有位置或者不夠四個位置了,那麼,你們要麼選擇等待等到有位置位置(進入等待隊列),要麼走人(拒絕服務)。

 

漏桶限流:

漏桶限流也可以理解爲漏斗式限流,即服務器按照指定的容量或者併發數來處理請求,超出容量後的新請求要麼等待、要麼拒絕。好比於漏斗,流出的那端就這麼大,能同時流出多少就是多少,但不會超過流出端的容量大小。

 

計數器限流:

計數器比較簡單粗暴,直接限定一個併發數值,只要一定時間內的請請求數超過設定的閾值,則開始限流,要麼等待要麼拒絕。

 

其實,三種限流方式既有相同之處,也有不同之處,他們之間的異同,留給你仔細品味咯,所謂我思故我在~

 

另外須知:

沒有絕對安全的接口,只有更加安全的接口。儘管魔高一尺,道高一丈,但魔也還會繼續長高的。

 

*本文到這裏就結束啦~希望對你有所幫助,歡迎留言或私信~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章