7個API安全最佳實踐

安全頻道發表於2022-03-08

一、序言

API是對公網暴露的系統入口,是直面網路攻擊的最前線,如果不能將其做到堅不可摧,那它很容易會在qiang林彈雨的網路攻擊中倒下
那怎樣的API才算得上堅不可摧呢?下面我將分享一些自己在實際的工作的安全心得,希望對大家有啟發!

二、API安全最佳實踐

1、注重使用者認證:

使用者的認證和授權是非常關鍵的,如果未做好相關工作,很容易出現認證繞過、任意使用者登陸、登陸或者註冊介面爆破等問題
那怎樣才能做好使用者認證介面呢

  • 透過驗證碼、簡訊驗證碼和介面呼叫速度來限制關鍵介面的爆破

  • 清晰的設計密碼找回、密碼修改等敏感介面的流程和token,避免被攻擊者繞過

  • 使用強隨機數和強加密演算法生成token,避免使用靜態token

  • 後臺對密碼強度進行校驗,限制使用者設定弱密碼

2、許可權控制

水平越權和垂直越權屬於業務邏輯漏洞,目前還沒有很好的工具能對該類漏洞進行有效檢測,越權漏洞的數量是和系統業務的複雜度成正比的
越權不是技術問題,而是設計問題,當一個系統的業務複雜度不斷升高時,它的許可權系統也要隨之進行升級,和業務高度耦合的而又精簡的許可權框架能有效的減少越權漏洞出現

批次操作的許可權校驗往往會被開發者忽略,因為批次操作需要對陣列進行迴圈鑑權,這也是越權漏洞的一個突破點

3、避免注入攻擊:

注入攻擊是很經典的攻擊型別,常見的sql注入、命令注入和xxe等都屬於注入攻擊
這類漏洞的防護相對會簡單一些

  • 保證每個進入系統的引數都被校驗,可以使用 spring validate 來做引數格式校驗

  • 儘量使用成熟框架,比如mybatis等,可以有效降低sql注入發生機率

在使用 spring validate 時,如果需要使用正則對一個複雜的引數進行校驗,應該儘量避免redos漏洞的出現
儘管使用框架,但排序、篩選欄位和超複雜的查詢還是容易出現sql注入,因為某些開發者會使用sql拼接來完成複雜的sql查詢

4、避免資訊洩露

資訊洩露造成的後果往往都是嚴重的,核心資料的洩露更是非常致命。

  • 做好輸出資料的控制,比如使用一個實體類來定義每個API輸出的資料,避免多餘的欄位被輸出到了前端

5、訪問頻率限制

關鍵介面要做好訪問頻率限制,比如:傳送簡訊驗證碼、登陸、修改密碼和註冊等,一般都是某些重要資源消耗型介面

  • 某些介面可以做多層限制,比如第1次發驗證碼直接發,第2次開始需要影像驗證碼,第15次開始限制ip

6、設定安全頭

安全頭可以大大提升系統整體的安全性,減少攻擊風險

  • Content-Security-Policy 可以在一定程度上防護xss攻擊

  • X-Frame-Options 可以阻止點選挾持攻擊

  • Strict-Transport-Security 可以強制通訊使用https

  • X-Content-Type-Options 可以限制MIME嗅探

  • Content-Security-Policy 可以管理網站允許載入的內容

7、注意容器和元件漏洞

前面6個措施有效的增加了API的安全性,但是如果某些攻擊是在程式還未執行到API入口就完成攻擊了呢
那一定是容器和元件漏洞,比如fastjson 、struts、甚至 tomcat、weblogic
這些框架和容器的某些版本都是存在一定可以執行RCE的CVE的

  • 儘量將專案使用的第三方元件升級到最新修正版

  • 使用sca產品對專案的元件進行檢測

三、結束語

透過上述的措施,可以大大提升API的安全能力,但是無法徹底的解決安全問題,因為安全是一個多維度、多角度、多層次的複雜問題,沒有任何一個產品和工具能徹底的解決安全的問題
安全需要開發者和安全工程師一起努力,掌握更多的安全知識和攻擊場景,才能將安全能力做到更高的水平


來自 “ Freebuf ”, 原文作者:chumo;原文連結:https://www.freebuf.com/articles/web/323554.html,如有侵權,請聯絡管理員刪除。

相關文章