關於RESTful API安全

2021-01-15 蟲蟲搜奇

隨著手機和移動網際網路的興起,REST(Representational State Transfer,表現層狀態傳輸)架構逐漸流行起來,被廣泛地使用。

REST這個名稱是Roy Fielding在美國加州UC Irvine大學的畢業博士論文中引入和定義的。Roy Fielding是個著名的網際網路技術專家,除了提出REST外,還曾參與HTTP協議以及Apache httpd Web伺服器的開發。

REST 的基本原理包括:

系統上的一切對象都要抽象為資源;

每個資源對應唯一的資源標識(URI);

對資源的操作不能改變資源標識本身;

所有的操作都是無狀態的等等。

RESTful API(應用程式接口)是符合RESTful規範的框架,用它可以實現跨平臺、廣泛覆蓋客戶端(包括瀏覽器和行動裝置)的HTTP服務。大多數網站提供API,以便開發人員可以在其上進行擴展開發,二次開發等。例如微信API,新浪微博API,百度APIStore,Github的API等。很多應用也提供WEB API以便和其他程序進行數據交互,比如著名監控系統Zabbix,筆者對zabbix api有個Perl打包,可以實現一些監控自動化方面的操作(打個廣告)。

還有一個筆者參與的QQ和微信的程序客戶端,提供API接口,能實現自動和QQ微信的交互等,筆者在這個項目基礎上寫了很多好玩的自動化插件。

實現隨機輸出名句、查詢IP歸屬地功能:

獲取監控數據功能:

好了閒話少敘,今天筆者在這裡和大家聊聊REST架構中需要關注的RESTful API安全性問題。

API身份驗證

在RESTful API設計中我們可以用多種方式來驗證,確保授權用戶使用API(當然對公眾開放的API不在此列,就不多討論)。我們最常用的身份驗證協議是HTTP基本身份驗證和OAuth。

HTTP基本身份驗證:

API驗證一般來說會使用基於Token的認證,第一次認證通過後,就會獲取到一個Token字串,以後請求中帶上此Token就可以。此Token憑據僅使用Base64編碼,沒有加密,沒有散列。每個請求都在頭部中包含此Token字串。因此,如果Web傳輸時候用的是沒有加密的HTTP,而不是HTTPS的話,基本上沒有任何安全可言,在網絡傳輸過程中會被別人抓包,很容易竊取到。所以,HTTP基本身份驗證非常危險,基本等於自殺。

但是一般來說我們如果是限制在內網、區域網內部使用的話,基本上還是可靠的。

原則一,不對對外開放不安全的API訪問權限、

原則二,使用HTTPS加密傳輸。

Oauth認證

Oauth(Open Authorization)協議為資源訪問提供一條簡易,開放和安全的通道。

在Oauth認證情況下,服務提供商、資源所有者提供商可靠地訪問token,通訪問Token獲取特定範圍的資源URL的許可。Oauth認證時時最主要的安全問題是訪問Token洩漏可能很危險,擁有Token的就可以獲得操作的權限。

在這方面著名的社交網絡網站Facebook就遭遇過安全問題。相關信息可以通過搜尋引擎獲得相應信息。

Goldshlager通過特定攻擊繞過OAuth的機制,通過漏洞實現劫持。

最後Facebook對此安全bug進行了買單,支付了發現者12,500美元的漏洞獎勵。

有安全機構曾對國內的服務商的Oauth安全做過調查,發現都曾有過一些問題。

下面是創宇安全團隊2014年的研究結果,現在應該都已經修復。

關於Oauth安全原則:

Redirect_uri全路徑驗證,避免URL跳轉出現問題;

狀態參數State要隨時銷毀;

獲取訪問Token時候,要驗證App 密串;

對回調URL進行跳轉校驗等。

用戶輸入安全:

應用程式維護中有一條規則安全性軍規:"絕不信任任何用戶的輸入"。這也適用於API的安全。現在,大多數情況下,Web應用程式都對輸入進行過濾,但是往往會忽略對來自API的數據進行過濾。比如我們舉一個例子:Jetspeed 2.3.1前版本用戶管理REST服務的漏洞CVE-2016-2171:

由於忽略了對API的輸入參數限制,所以可以利用它添加、編輯、刪除用戶。

構造用戶管理 REST API 創建用戶chonchong:

然後將用戶提升為管理員權限

還可能有sql注入或者xxl注入的漏洞,比如dotCMS的sql注入漏洞

安全原則:戶輸入嚴格過濾。

RESTful API進行拒絕式攻擊(DDOS,CC)

還有一種常見的攻擊是對API做ddos攻擊。ddos攻擊很容易,只需對API接口進行循環調用即可。由於獲取數據很慢,耗時,如果服務端對訪問數量和頻率沒有控制的話,很容易就會造成cc攻擊。很容易一條腳本、無需肉雞,無需帶寬就能讓你的服務在短時間內爆掉。

比如,下面我們展示一個通過WordPress的API爆破帳號和密碼的python腳本:

大多數REST API服務供應者,都會每個用戶/Token數做限制。速率限制還可以防止暴力破解攻擊(比如上面例子)。

安全原則:限制請求並發數,限制用戶訪問請求的頻率。

關於RESTful API的安全性是一個巨大的話題,筆者在此只做個簡單概述,拋磚引玉,如果你對此感興趣,請關注小編和我探討。或者回複本文章。

相關焦點

  • RESTful API簡述
    我們將native類型數據轉為json即為序列化,將json轉為native類型數據即為反序列化認證和權限機制開發一套完整的RESTful API,權限機制必須納入考慮範圍,雖然權限機制的具體實現依賴於業務,權限機制本身,是有典型的模式存在的,需要開發者掌握基本的權限機制實現方案,以便隨時應用到API中去用戶認證和權限機制,這兩大點是使RESTful API 強大、靈活和安全的基本保障常用的認證機制是
  • 如何設計restful風格接口
    restful風格接口URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。識別(identify)、 表示(represent) 、交互(interact with)。看Url就知道要什麼看http method就知道幹什麼看http status code就知道結果如何1.
  • Restful Api-接口設計
    獲取資源 POST(CREATE)創建資源 PATCH(UPDATE)更新資源的部分屬性(很少用,一般用POST代替) PUT(UPDATE)更新資源,客戶端需要提供新建資源的所有屬性 DELETE(DELETE)刪除資源使用方式 GET http://www.birjemin.com/api
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful
  • 理解RESTful API 架構設計規範與實踐
    例如:https://www.sample.com/api/shops/10083 - 編號10083店鋪的基本信息https://www.sample.com/api/users/2372/orders - 編號2372用戶的所有訂單信息在標準的 REST 規範觀點中,通常會要求將資源 shop 加上複數形式 s 表示多個資源。
  • 利用yii2和swagger打造完美的RestFul Api接口
    第五步、開始寫接口並且為每個接口做路由配置還是上面說的,我們只配置了swagger掃描api/controllers這個目錄下的文件。所以,我們還是把接口文件寫在api/controllers目錄下。就舉例叫UserController.php現在,我們接口也寫好了,按道理是可以訪問的了,但是我們還需要配置下路由,以便更加健壯和兼容性好!
  • 面試官:你連 RESTful 都不知道我怎麼敢要你?|原力計劃
    前言回歸正題,看過很多RESTful相關的文章總結,參齊不齊,結合工作中的使用,非常有必要歸納一下關於RESTful架構方式了,RESTful只是一種架構方式的約束,給出一種約定的標準,完全嚴格遵守RESTful標準並不是很多,也沒有必要。但是在實際運用中,有RESTful標準可以參考,是十分有必要的。
  • RESTful風格/RESTful Api/RESTful 架構?
  • RESTful-API還沒理解麼?只是因為你沒看這篇文章,其實它很簡單
    比如:對api.example.com接口發出GET請求,會得到下面的JSON響應結果。上面響應結果,JSON文本中的link屬性,用來說明API消費者可以知道下一步可以調用什麼API或者該調用什麼API。2.8. 資源過濾、排序、選擇和分頁的表述2.9. 版本化你的API強制性增加API版本聲明,不要發布無版本的API。
  • Azure 靜態 web 應用集成 Azure 函數 API
    但是一個真正的web應用,總是免不了需要後臺api服務為前端提供數據或者處理數據的能力。同樣前面我們也介紹了Azure函數服務,Azure函數的http trigger可以對http作出響應,可以完美的承當web api的角色。現在Azure靜態web應用可以直接集成Azure函數,使得一次發布可以同時發布前端項目(vue、blazor)及後臺api服務(azure函數)。
  • 這後端API接口寫得才叫一個優雅!網友直呼:666
    針對URL路徑的restful風格,以及傳入參數的公共請求頭的要求(如:app_version,api_version,device等),老顧這裡就不介紹了,小夥伴們可以自行去了解,也比較簡單。 著重介紹一下後端伺服器如何實現把數據返回給前端?
  • 新浪微博 API開發簡介之 Python篇
    於是照著寫了一個:# -*- coding: utf-8 -*-from weibopy.auth import OAuthHandlerfrom weibopy.api import APIconsumer_key= '應用的key'consumer_secret ='應用的App Secret'
  • 手把手教你學Numpy——常用API合集
    實際上numpy的內部會將高維數組轉化成一維之後再進行這個操作,我們可以reshape一下數組來進行驗證:這些只是api的基本用法,numpy當中支持的功能不僅如此。我們觀察一下這些函數會發現,它們的作用域都是一組數據,返回的是一組數據通過某種運算得到的結果。舉個例子,比如sum,是對一組數據的價格。std計算的是一組數據的標準差,這樣的函數我們稱為聚合函數。
  • api 微博數據專題及常見問題 - CSDN
    如果只是為了收集數據可以諮詢我的郵箱,如果是為了學習爬蟲,建議改學phantomjs從網頁中爬取微博的)利用新浪API實現數據的抓取(由於api接口限制增大,本文已基本廢棄) 2018.5.16 提示 微博的api接口現在已經不好用了,普通權限的token已經爬不到什麼數據了,想要用這個代碼爬大量數據的已經不太可能,只能作為熟悉微博api
  • Python 快速搭建 RESTful API
  • Baidu與Google地圖API初探
    1.0, user-scalable=no" /> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <title>Baidu Map V1.2</title> <script type="text/javascript" src="http://api.map.baidu.com
  • api框架 web 最好的go_golang api框架 - CSDN
    關於golang的包管理和依賴,我們以後再討論。當然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。restful路由gin的路由來自httprouter庫。