簡體   English   中英

從JavaScript到后端的API調用:無需服務器端代碼即可確保合法性

[英]API calls from JavaScript to backend: Ensuring legitimacy without server-side code

我想創建一個Javascript小部件,我的用戶可以將其放在他們的網站上。 該小部件能夠創建音頻, 這反過來又要花我的用戶錢。

為了說明起見,假設每當互聯網上的任何人(即我的用戶的用戶)加載放置在我的用戶站點上的小部件時,我都向我的用戶收取$ 1的費用。

小部件是包裹在HTML音頻播放器周圍的Javascript代碼。 每次加載時,JS代碼都會向我的后端API發出請求,並且在收到我的后端API的響應后,就構造了播放器。

圖解:

圖

我擔心的是不是我的用戶的人的惡意使用。 假設有人獲取了他們在屬於我的一個用戶的網站上找到的小部件的源代碼,然后將其放置在自己的網站上。 因此,他們將使用我的服務,但不付款。 相反,我的實際用戶將為此付費(假定我使用公共API密鑰作為區分用戶的一種方式)。

通常,可以通過讓服務器端庫負責可能會花費金錢的任何使用來避免這種情況。 例如,我將Pusher用作WebSockets IaaS,每當我要發布消息時,就必須在服務器端使用它們的PHP SDK同時使用私有和公共API密鑰。

在我的用例中,必須沒有服務器端庫。

問題:如何確保收到的API請求是合法的?

我考慮過使用放置小部件的主機名作為合法性度量。 在小部件設置期間,我可以要求我的用戶將某些(子)域列入白名單,並拒絕所有不符合條件的請求,但這很容易被諸如自定義本地域或CURL-精心制作的要求。

我了解這可能無法實現。

您的要求似乎與客戶端加密主題密切相關。 在大多數情況下,答案是“否”,這是不可能的。 但是,在這種情況下,可以按照以下方式實現某些功能。 如果可以讓您的客戶安裝插件(您將要構建),則可以在完成JS代碼后對其進行加密,並讓服務器提供該加密文件。 通常,如果您要發送的是加密文件,則需要通過某種方式讓客戶端對其進行解密。 這將要求您還提供一個未加密的JS文件來進行解碼,但是通過提供未加密的解碼器,您將無法消除通過加密主JS文件而獲得的任何安全性(解密文件可以很容易地用於對加密方法進行反向工程/為您的目標用戶以外的其他人直奔廣告)。 現在,在這里方便那些API用戶(以及通過服務器-客戶端連接之外的方式與他們通信的能力)的地方。 如果您構建一個解密插件並將其提供給API用戶(您可以為每個用戶發布一個唯一的解密密鑰,但是如果沒有服務器訪問權限,則實現唯一的用戶密鑰將非常困難/不可能),然后該插件可以解密您提供的文件在他們的瀏覽器中,從本質上保證了只有您提供“密鑰”的用戶才能訪問您的軟件。 但是,此方法有一些警告。 這意味着您對用戶足夠信任,以至於他們不會分發該插件(無論如何分發它們都是他們的意圖,因為如果有人假冒他們可能會導致更高的費用)。 這種方法可能還存在其他一些安全問題,但是,我現在無法想到它們。 如果有任何想法,我將對此帖子進行編輯並添加它們。

顯然,我還沒有足夠的名聲來發表評論,因此發表了這篇文章。但是,對於您的帖子,我認為這種方法似乎比我建議的方法好得多; 我沒有意識到您可以控制API對服務器的響應。

我不太了解您的意思是:

a)向用戶發送一個JS文件,其唯一目的是確定是否也應該發送播放器(即,到達后,它將用客戶端的API密鑰/網址ping服務器), 然后服務器將提供文件(在在這種情況下,您的方法對我來說似乎是安全的,但其他人可能會發現與此相關的安全問題)。

要么

b)發送帶有JS 音頻播放器的文件,文件到達后確定URL和API密鑰是否正確,然后允許音頻播放器正常運行(將API密鑰發送到服務器以跟蹤使用情況,而不是安全功能)。

如果使用選項b,則不會提高安全性。 如果您的代碼依賴於在客戶端運行的安全性,並且安全系統是通過與代碼相同的方式發送的,則幾乎毫無例外,設計的系統存在缺陷並且本質上是不安全的。

希望對您有所幫助,如果您不同意/有其他疑問,請隨時發表評論!

如何將以下參數從JavaScript小部件發送到API后端:

  • 公用API密鑰(例如bbbe3b259f881cfc796f468619eb9d
  • 當前網址(例如https://example.com/articles/chiang-mai-thailand-january-2016-june-2016

我將使用API密鑰作為區分我的用戶和當前URL為知道哪個音頻文件創建(我的小部件會創建一個基於URL的音頻文件)的方式的一種方式。

此外, 這很關鍵 ,我將在中央站點上讓用戶將其域和子域列入白名單,在該站點上,用戶將獲得其小部件代碼。

這與FB對它們的集成所做的相同: 在此處輸入圖片說明

因此,例如,如果我的后端API接收到上述示例URL,並且用戶已將小部件設置為僅允許屬於foo.combar.baz.com ,我將拒絕音頻創建過程並顯示錯誤。

您看到這種方法有什么問題嗎?

暫無
暫無

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

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