隨著手機和移動網際網路的興起,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的安全性是一個巨大的話題,筆者在此只做個簡單概述,拋磚引玉,如果你對此感興趣,請關注小編和我探討。或者回複本文章。