簡體   English   中英

保護公共 API 免受不需要的“提交”

[英]Protect public API from unwanted “submissions”

我一直在安靜地擺弄這個問題一段時間,但到目前為止還沒有找到令人滿意的解決方案。

我們目前正在創建一個新的公共 API,小部件將使用它來獲取信息,但也將信息回傳到系統(如聯系表格)。 由於小部件將作為 web 組件實現並且可以在任何頁面上實現,因此我們無法控制小部件的交付方式。

我現在面臨的問題是:我們如何保護 API 免受不必要的提交(除了常規表單驗證),以便我們可以安靜地確定它是來自該表單的提交,還是對 API 的合法 POST?

我擔心的是,在這種情況下,所有內容都是可欺騙的(例如,獲取表單令牌並將其作為 header 提交,驗證源標頭,...),因為它很容易被欺騙,即使用 Postman。 對於您的任何經驗和正確方向的提示,我將非常高興。

我想你可以試試:

  • 基於 IP 的速率限制
  • 一般插入的速率限制
  • 發送后需要 email 驗證(如果您有此數據)
  • 保存發件人 IP 並檢查舊數據,以了解是否有人濫用(監控提示,但也許不是壞主意)
  • 驗證碼以避免惡意發件人(但根本不是)

你有沒有實現過類似的東西? 也許通過看到你有什么,我們可以看到缺少什么。

由於是公開的,並且允許從任何系統訪問,它也很復雜。 也許評估一個認證系統,並從小部件本身進行認證,通過密鑰結合速率限制是一個好主意。

如果你有一個沒有認證的公共 API,
您所能做的就是讓黑客盡可能難以訪問。

換句話說:在門上放更多/復雜的鎖……但可以選擇任何鎖

使用 URI 的“鎖定”代碼

我們用來保持 WebComponent “安全”的方法,
是從一個長 URI 加載 WebComponent:

(現代瀏覽器不再有 2048 個字符的 URI 限制)

https://domain/p1/p2/customeElements/define/secure-api/HTMLElement/p7/p8/webcomponent.js

然后組件代碼將 URI解碼

let p = [domain,p1,p2,"customElements","define","secure-api","HTMLElement",p7,p8]

執行 JavaScript:

window[p[3]][p[4]](p[5],class extends window[p[6]]{...

更多鎖具

如果你加入一些 BtoA/AtoB 和 String.reverse() 轉換

https://domain/AH=V/CV=/==QYvRnY/aW5uZXJ/IVE1M/webcomponent.js

你已經阻止了大多數潛在的黑客

更多鎖具

通過在服務器端生成webcomponent.js以使用/domain/部分,
那個長的 URI 可以是服務器和客戶端之間的(唯一的)握手

更復雜的鎖

由於所有 state 都在 URI 中,因此很容易應用地址移位機制,
每個請求都可以是不同的 URI(使 PostMan 無法使用並且調試起來也很痛苦:-)

[我們還應用了一些其他技巧,我不會在這里解釋]

它不會阻止黑客,但會延遲他們足夠長的時間讓大多數人放棄。

還有一個捕鼠器

在我們的代碼/URI 編碼中,我們還包含了對唯一“ mousetrap ”URI 的引用。
如果我們在該子目錄中檢測到 404 活動,我們就知道有人在主動開鎖。
而且..我們可以交互地引導/引導他們到更多的捕鼠器。

到目前為止,我們只進行了一次嘗試。

一個電話(因為我們知道買家域名)就足以讓他們停下來。

您好 [非常大-知名] IT 公司 X 的 IT 經理,
如果我們檢測到來自貴公司 IP 地址 nn.nn.nn.nn 的黑客攻擊,
根據法律,我們必須向當局報告

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM