開發(fā)安全的 API 所需要核對的清單
原文:https://github.com/shieldfy/API-Security-Checklist/blob/master/README-zh.md,個人覺得非常有用,轉(zhuǎn)載這里幫助開發(fā)者們開發(fā)出安全的 API。以下是正文:
以下是當你在設(shè)計,測試以及發(fā)布你的 API 的時候所需要核對的重要安全措施。
身份認證
- [ ] 不要使用
Basic Auth,請使用標準的認證協(xié)議(如 JWT[1],OAuth[2])。 - [ ] 不要重新實現(xiàn)
Authentication、token generating和password storing,請使用標準庫。 - [ ] 限制密碼錯誤嘗試次數(shù),并且增加賬號凍結(jié)功能。
- [ ] 加密所有的敏感數(shù)據(jù)。
JWT(JSON Web Token)
- [ ] 使用隨機復(fù)雜的密鑰(
JWT Secret)以增加暴力破解的難度。 - [ ] 不要在請求體中直接提取數(shù)據(jù),要對數(shù)據(jù)進行加密(
HS256或RS256)。 - [ ] 使 token 的過期時間盡量的短(
TTL,RTTL)。 - [ ] 不要在 JWT 的請求體中存放敏感數(shù)據(jù),因為它是可解碼的[3]。
- [ ] 避免存儲過多的數(shù)據(jù)。JWT 通常在標頭中共享,并且它們有大小限制。
訪問
- [ ] 限制流量來防止 DDoS 攻擊和暴力攻擊。
- [ ] 在服務(wù)端使用 HTTPS 協(xié)議來防止 MITM (中間人攻擊)。
- [ ] 使用
HSTS協(xié)議防止 SSL Strip 攻擊。 - [ ] 關(guān)閉目錄列表。
- [ ] 對于私有 API,僅允許從列入白名單的 IP/主機進行訪問。
Authorization
OAuth 授權(quán)或認證協(xié)議
- [ ] 始終在后臺驗證
redirect_uri,只允許白名單的 URL。 - [ ] 始終在授權(quán)時使用有效期較短的授權(quán)碼(code)而不是令牌(access_token)(不允許
response_type=token)。 - [ ] 使用隨機哈希數(shù)的
state參數(shù)來防止跨站請求偽造(CSRF)。 - [ ] 對不同的應(yīng)用分別定義默認的作用域和各自有效的作用域參數(shù)。
輸入
- [ ] 使用與操作相符的 HTTP 操作函數(shù),
GET(讀取),POST(創(chuàng)建),PUT(替換/更新)以及DELETE(刪除記錄),如果請求的方法不適用于請求的資源則返回405 Method Not Allowed。 - [ ] 在請求頭中的
content-type字段使用內(nèi)容驗證來只允許支持的格式(如application/xml,application/json等等)并在不滿足條件的時候返回406 Not Acceptable。 - [ ] 驗證
content-type中申明的編碼和你收到正文編碼一致(如application/x-www-form-urlencoded,multipart/form-data,application/json等等)。 - [ ] 驗證用戶輸入來避免一些普通的易受攻擊缺陷(如
XSS,SQL-注入,遠程代碼執(zhí)行等等)。 - [ ] 不要在 URL 中使用任何敏感的數(shù)據(jù)(
credentials,Passwords,security tokens,orAPI keys),而是使用標準的認證請求頭。 - [ ] 僅使用服務(wù)器端加密。
- [ ] 使用一個 API Gateway 服務(wù)來啟用緩存、限制訪問速率(如
Quota,Spike Arrest,Concurrent Rate Limit)以及動態(tài)地部署 APIs resources。
處理
- [ ] 檢查是否所有的接口都包含必要都身份認證,以避免被破壞了的認證體系。
- [ ] 避免使用特有的資源 id。使用
/me/orders替代/user/654321/orders。 - [ ] 使用
UUID代替自增長的 id。 - [ ] 如果需要解析 XML 文件,確保實體解析(entity parsing)是關(guān)閉的以避免
XXE攻擊。 - [ ] 如果需要解析 XML 文件,確保實體擴展(entity expansion)是關(guān)閉的以避免通過指數(shù)實體擴展攻擊實現(xiàn)的
Billion Laughs/XML bomb。 - [ ] 在文件上傳中使用 CDN。
- [ ] 如果數(shù)據(jù)處理量很大,盡可能使用隊列或者 Workers 在后臺處理來避免阻塞請求,從而快速響應(yīng)客戶端。
- [ ] 不要忘了把 DEBUG 模式關(guān)掉。
- [ ] 可用時使用不可執(zhí)行的堆棧。
輸出
- [ ] 增加請求返回頭
X-Content-Type-Options: nosniff。 - [ ] 增加請求返回頭
X-Frame-Options: deny。 - [ ] 增加請求返回頭
Content-Security-Policy: default-src 'none'。 - [ ] 刪除請求返回中的指紋頭 -
X-Powered-By,Server,X-AspNet-Version等等。 - [ ] 在響應(yīng)中遵循請求的
content-type,如果你的請求類型是application/json那么你返回的content-type就是application/json。 - [ ] 不要返回敏感的數(shù)據(jù),如
credentials,Passwords,security tokens。 - [ ] 給請求返回使用合理的 HTTP 響應(yīng)代碼。(如
200 OK,400 Bad Request,401 Unauthorized,405 Method Not Allowed等等)。
持續(xù)集成和持續(xù)部署
- [ ] 使用單元測試以及集成測試的覆蓋率來保障你的設(shè)計和實現(xiàn)。
- [ ] 引入代碼審查流程,禁止私自合并代碼。
- [ ] 在推送到生產(chǎn)環(huán)境之前確保服務(wù)的所有組件都用殺毒軟件靜態(tài)地掃描過,包括第三方庫和其它依賴。
- [ ] 對您的代碼持續(xù)運行安全測試(靜態(tài)/動態(tài)分析)。
- [ ] 檢查您的依賴項(軟件和操作系統(tǒng))是否存在已知漏洞。
- [ ] 為部署設(shè)計一個回滾方案。
監(jiān)控
- [ ] 對所有服務(wù)和組件使用集中式登錄。
- [ ] 使用代理來監(jiān)控所有流量、錯誤、請求和響應(yīng)。
- [ ] 使用短信,Slack,電子郵件,電報,Kibana, Cloudwatch等提醒。
- [ ] 確保你沒有記錄任何敏感數(shù)據(jù),如信用卡、密碼、pin等。
- [ ] 使用IDS和/或IPS系統(tǒng)監(jiān)視您的API請求和實例。
也可以看看
- yosriady/api-development-tools[4] - 用于構(gòu)建 RESTful HTTP + JSON API 的有用資源集合。
參考資料
[1]https://jwt.io/
[2]https://oauth.net/
[3]https://jwt.io/#debugger-io
[4]https://github.com/yosriady/api-development-tools
評論
圖片
表情
