Moralis 安全

2022-05-11 14:46 更新

客戶端與服務(wù)器

當(dāng)應(yīng)用程序首次連接到 Moralis 時(shí),它會(huì)使用應(yīng)用程序 ID 來(lái)標(biāo)識(shí)自己。此密鑰作為您的應(yīng)用程序的一部分提供,任何人都可以從他們的設(shè)備反編譯您的應(yīng)用程序或代理網(wǎng)絡(luò)流量以找到它。使用 JavaScript 可以更輕松地利用這一漏洞——只需在瀏覽器中“查看源代碼”并立即找到您的客戶端密鑰。

這就是 Moralis 具有許多其他安全功能來(lái)幫助您保護(hù)數(shù)據(jù)的原因。

客戶端密鑰已提供給您的用戶,因此任何僅使用客戶端密鑰即可完成的事情對(duì)公眾來(lái)說(shuō)是可行的,甚至是惡意黑客。

另一方面,萬(wàn)能鑰匙絕對(duì)是一種安全機(jī)制。使用主密鑰可以繞過(guò)應(yīng)用程序的所有安全機(jī)制,例如類級(jí)別權(quán)限和 ACL。擁有主密鑰就像擁有對(duì)應(yīng)用程序服務(wù)器的 root 訪問(wèn)權(quán)限,您應(yīng)該像保護(hù)生產(chǎn)機(jī)器的 root 密碼一樣熱情地保護(hù)您的主密鑰。

總體理念是限制客戶端的權(quán)力(使用客戶端密鑰)并執(zhí)行任何需要 Cloud Code 中的主密鑰的敏感操作。您將在標(biāo)題為“在云代碼中實(shí)現(xiàn)業(yè)務(wù)邏輯”的部分中學(xué)習(xí)如何最好地利用這種能力。

最后說(shuō)明:建議在您的服務(wù)器中設(shè)置 HTTPS 和 SSL,以避免中間人攻擊,但 Moralis 也適用于非 HTTPS 連接。

類級(jí)權(quán)限

第二級(jí)安全性是架構(gòu)和數(shù)據(jù)級(jí)別。 在此級(jí)別執(zhí)行安全措施將限制客戶端應(yīng)用程序訪問(wèn)和創(chuàng)建 Moralis 數(shù)據(jù)的方式和時(shí)間。 當(dāng)您第一次開始開發(fā) Moralis 應(yīng)用程序時(shí),會(huì)設(shè)置所有默認(rèn)值,以便您可以成為更有效率的開發(fā)人員。 例如:

  • 客戶端應(yīng)用程序可以在 Moralis 上創(chuàng)建新類。
  • 客戶端應(yīng)用程序可以向類添加字段。
  • 客戶端應(yīng)用程序可以修改或查詢 Moralis 上的對(duì)象。

您可以將這些權(quán)限中的任何一個(gè)配置為適用于所有人、任何人或應(yīng)用程序中的特定用戶或角色。

角色是包含用戶或其他角色的組,您可以將其分配給對(duì)象以限制其使用。 授予角色的任何權(quán)限也授予其任何子項(xiàng),無(wú)論他們是用戶還是其他角色,使您能夠?yàn)槟膽?yīng)用程序創(chuàng)建訪問(wèn)層次結(jié)構(gòu)。

一旦你確信你在你的應(yīng)用程序中擁有正確的類和類之間的關(guān)系,你應(yīng)該開始通過(guò)執(zhí)行以下操作來(lái)鎖定它:

幾乎您創(chuàng)建的每個(gè)類都應(yīng)該在某種程度上調(diào)整這些權(quán)限。 對(duì)于每個(gè)對(duì)象都具有相同權(quán)限的類,類級(jí)別的設(shè)置將是最有效的。 例如,一個(gè)常見的用例需要擁有一類任何人都可以讀取但沒(méi)有人可以寫入的靜態(tài)數(shù)據(jù)。

配置類級(jí)別權(quán)限

Moralis 允許您指定每個(gè)類允許的操作。 這使您可以限制客戶端訪問(wèn)或修改您的類的方式。 要更改這些設(shè)置,請(qǐng)轉(zhuǎn)到“數(shù)據(jù)瀏覽器”,選擇一個(gè)類,然后單擊“安全”按鈕。

您可以配置客戶端對(duì)所選類執(zhí)行以下每個(gè)操作的能力:

  • 讀:
    • ?Get?:如果用戶知道自己的?objectIds?,就可以獲取該表中的對(duì)象。
    • ?Find?:任何擁有 Find 權(quán)限的人都可以查詢表中的所有對(duì)象,即使他們不知道自己的 ?objectId?。除非您在每個(gè)對(duì)象上放置 ACL,否則任何具有公共 Find 權(quán)限的表都將完全被公眾讀取。
  • 寫:
    • 更新:任何擁有更新權(quán)限的人都可以修改表中沒(méi)有 ACL 的任何對(duì)象的字段。對(duì)于公開可讀的數(shù)據(jù),例如游戲關(guān)卡或資產(chǎn),您應(yīng)該禁用此權(quán)限。
    • 創(chuàng)建:與更新一樣,任何擁有創(chuàng)建權(quán)限的人都可以創(chuàng)建類的新對(duì)象。與更新權(quán)限一樣,您可能希望將其關(guān)閉以獲取公開可讀的數(shù)據(jù)。
    • 刪除:有了這個(gè)權(quán)限,人們可以刪除表中沒(méi)有 ACL 的任何對(duì)象。他們只需要它的?objectId?。
  • 添加字段:Moralis 類具有在創(chuàng)建對(duì)象時(shí)推斷的模式。在開發(fā)應(yīng)用程序時(shí),這很棒,因?yàn)槟梢韵驅(qū)ο筇砑有伦侄?,而無(wú)需在后端進(jìn)行任何更改。但是一旦你發(fā)布了你的應(yīng)用程序,就很少需要自動(dòng)將新字段添加到你的類中。當(dāng)您向公眾提交您的應(yīng)用程序時(shí),您幾乎應(yīng)該始終關(guān)閉所有課程的此權(quán)限。

對(duì)于上述每個(gè)操作,您可以向所有用戶授予權(quán)限(這是默認(rèn)設(shè)置),或?qū)?quán)限鎖定到角色和用戶列表。

例如,一個(gè)應(yīng)該對(duì)所有用戶都可用的類將通過(guò)僅啟用 get 和 find 設(shè)置為只讀。 通過(guò)只允許創(chuàng)建,可以將日志記錄類設(shè)置為只寫。 您可以通過(guò)提供對(duì)一組特定用戶或角色的更新和刪除訪問(wèn)權(quán)限來(lái)啟用用戶生成內(nèi)容的審核。

對(duì)象級(jí)訪問(wèn)控制

鎖定架構(gòu)和類級(jí)別權(quán)限后,就該考慮用戶如何訪問(wèn)數(shù)據(jù)了。 對(duì)象級(jí)訪問(wèn)控制使一個(gè)用戶的數(shù)據(jù)與另一個(gè)用戶的數(shù)據(jù)分開,因?yàn)橛袝r(shí)一個(gè)類中的不同對(duì)象需要由不同的人訪問(wèn)。 例如,用戶的私人個(gè)人數(shù)據(jù)應(yīng)該只有他們才能訪問(wèn)。

對(duì)于那些想要存儲(chǔ)和保護(hù)用戶特定數(shù)據(jù)而不需要顯式登錄的應(yīng)用程序,Moralis 還支持匿名用戶的概念。

當(dāng)用戶登錄應(yīng)用程序時(shí),他們會(huì)啟動(dòng)與 Moralis 的會(huì)話。 通過(guò)此會(huì)話,他們可以添加和修改自己的數(shù)據(jù),但無(wú)法修改其他用戶的數(shù)據(jù)。

訪問(wèn)控制列表

控制誰(shuí)可以訪問(wèn)哪些數(shù)據(jù)的最簡(jiǎn)單方法是通過(guò)訪問(wèn)控制列表,通常稱為 ACL。 ACL 背后的想法是每個(gè)對(duì)象都有一個(gè)用戶和角色列表以及該用戶或角色擁有的權(quán)限。 用戶需要讀取權(quán)限(或必須屬于具有讀取權(quán)限的角色)才能檢索對(duì)象的數(shù)據(jù),并且用戶需要寫入權(quán)限(或必須屬于具有寫入權(quán)限的角色)才能更新或刪除該對(duì)象 目的。

擁有用戶后,您就可以開始使用 ACL。 請(qǐng)記住,可以通過(guò)傳統(tǒng)的用戶名/密碼注冊(cè)、通過(guò) Facebook 或 Twitter 等第三方登錄系統(tǒng),甚至使用 Moralis 的自動(dòng)匿名用戶功能來(lái)創(chuàng)建用戶。 要將當(dāng)前用戶數(shù)據(jù)的 ACL 設(shè)置為不公開可讀,您所要做的就是:

var user = Moralis.User.current();
user.setACL(new Moralis.ACL(user));

大多數(shù)應(yīng)用程序都應(yīng)該這樣做。如果您存儲(chǔ)任何敏感的用戶數(shù)據(jù),例如電子郵件地址或電話號(hào)碼,則需要設(shè)置這樣的 ACL,以便其他用戶看不到用戶的私人信息。如果一個(gè)對(duì)象沒(méi)有 ACL,那么每個(gè)人都可以讀寫。默認(rèn)情況下,Moralis 在新的用戶對(duì)象上設(shè)置 ACL,以便只有用戶可以讀取或?qū)懭胨麄冏约旱臄?shù)據(jù)。 (如果您作為開發(fā)人員需要更新其他 _User 對(duì)象,請(qǐng)記住您的主密鑰可以提供執(zhí)行此操作的能力。)

如果您希望用戶擁有一些公開的數(shù)據(jù)和一些私有的數(shù)據(jù),最好有兩個(gè)單獨(dú)的對(duì)象。您可以從公共數(shù)據(jù)中添加指向私有數(shù)據(jù)的指針。

您還可以為類中的不同列設(shè)置不同的權(quán)限。有關(guān)實(shí)際演示,請(qǐng)參閱視頻。

當(dāng)然,您可以對(duì)一個(gè)對(duì)象設(shè)置不同的讀寫權(quán)限。例如,這是為用戶的公開帖子創(chuàng)建 ACL 的方式,任何人都可以閱讀它:

var acl = new Moralis.ACL();
acl.setPublicReadAccess(true);
acl.setWriteAccess(Moralis.User.current().id, true);

有時(shí)在每個(gè)用戶的基礎(chǔ)上管理權(quán)限是不方便的,并且您希望擁有一組獲得相同待遇的用戶(例如一組具有特殊權(quán)力的管理員)。 角色是一種特殊的對(duì)象,可讓您創(chuàng)建一組可以全部分配給 ACL 的用戶。 角色的最佳之處在于,您可以在角色中添加和刪除用戶,而無(wú)需更新僅限于該角色的每個(gè)對(duì)象。 要?jiǎng)?chuàng)建只能由管理員寫入的對(duì)象:

var acl = new Moralis.ACL();
acl.setPublicReadAccess(true);
acl.setRoleWriteAccess("admins", true);

當(dāng)然,這個(gè)片段假設(shè)你已經(jīng)創(chuàng)建了一個(gè)名為“admins”的角色。 當(dāng)您在開發(fā)應(yīng)用程序時(shí)設(shè)置了一小組特殊角色時(shí),這通常是合理的。 角色也可以即時(shí)創(chuàng)建和更新——例如,在每次連接后將新朋友添加到“friendOf___”角色。

這一切只是一個(gè)開始。 應(yīng)用程序可以通過(guò) ACL 和類級(jí)別權(quán)限強(qiáng)制執(zhí)行各種復(fù)雜的訪問(wèn)模式。 例如:

  • 對(duì)于私有數(shù)據(jù),可以將讀寫權(quán)限限制為所有者。
  • 對(duì)于留言板上的帖子,“版主”角色的作者和成員可以擁有“寫入”權(quán)限,而普通大眾可以擁有“閱讀”權(quán)限。
  • 對(duì)于只能由開發(fā)人員使用主密鑰通過(guò) REST API 訪問(wèn)的日志記錄數(shù)據(jù),ACL 可以拒絕所有權(quán)限。
  • 由特權(quán)用戶組或開發(fā)人員創(chuàng)建的數(shù)據(jù)(例如當(dāng)前的全局消息)可以具有公共讀取權(quán)限,但將寫入權(quán)限限制為“管理員”角色。
  • 從一個(gè)用戶發(fā)送給另一個(gè)用戶的消息可以只為這些用戶提供“讀取”和“寫入”訪問(wèn)權(quán)限。

這是一個(gè) ACL 的格式,它限制所有者(其 objectId 由“?aSaMpLeUsErId?”標(biāo)識(shí))的讀寫權(quán)限并允許其他用戶讀取該對(duì)象:

{
    "*": { "read":true },
    "aSaMpLeUsErId": { "read" :true, "write": true }
}

這是使用角色的 ACL 格式的另一個(gè)示例:

{
    "role:RoleName": { "read": true },
    "aSaMpLeUsErId": { "read": true, "write": true }
}

指針權(quán)限

指針權(quán)限是一種特殊類型的類級(jí)別權(quán)限,它根據(jù)存儲(chǔ)在這些對(duì)象的指針字段中的用戶,在類中的每個(gè)對(duì)象上創(chuàng)建一個(gè)虛擬 ACL。例如,給定一個(gè)具有 owner 字段的類,在 owner 上設(shè)置讀取指針權(quán)限將使類中的每個(gè)對(duì)象只能由該對(duì)象的 owner 字段中的用戶讀取。對(duì)于有發(fā)送者和接收者字段的類,接收者字段的讀指針權(quán)限和發(fā)送者字段的讀寫指針權(quán)限將使類中的每個(gè)對(duì)象在發(fā)送者和接收者字段中用戶可讀,可寫僅由用戶在發(fā)件人字段中。

鑒于對(duì)象通常已經(jīng)具有指向應(yīng)該對(duì)對(duì)象具有權(quán)限的用戶的指針,指針權(quán)限提供了一種簡(jiǎn)單而快速的解決方案,用于使用已經(jīng)存在的數(shù)據(jù)保護(hù)您的應(yīng)用程序,無(wú)需編寫任何客戶端代碼或云代碼。

指針權(quán)限類似于虛擬 ACL。它們不會(huì)出現(xiàn)在 ACL 列中,但如果您熟悉 ACL 的工作原理,則可以將它們視為 ACL。在上面的發(fā)送方和接收方示例中,每個(gè)對(duì)象的行為就好像它具有以下 ACL:

{
    "<SENDER_USER_ID>": {
        "read": true,
        "write": true
    },
    "<RECEIVER_USER_ID>": {
        "read": true
    }
}

請(qǐng)注意,此 ACL 實(shí)際上并不是在每個(gè)對(duì)象上創(chuàng)建的。 當(dāng)您添加或刪除指針權(quán)限時(shí),任何現(xiàn)有的 ACL 都不會(huì)被修改,并且任何嘗試與對(duì)象交互的用戶只有在指針權(quán)限創(chuàng)建的虛擬 ACL 和對(duì)象上已經(jīng)存在的真實(shí) ACL 都允許的情況下才能與對(duì)象交互 互動(dòng)。 出于這個(gè)原因,將指針權(quán)限和 ACL 結(jié)合起來(lái)有時(shí)會(huì)讓人感到困惑,因此我們建議對(duì)沒(méi)有設(shè)置很多 ACL 的類使用指針權(quán)限。 幸運(yùn)的是,如果您以后決定使用云代碼或 ACL 來(lái)保護(hù)您的應(yīng)用程序,則很容易刪除指針權(quán)限。

需要身份驗(yàn)證權(quán)限

CLP ?requiresAuthentication ?防止任何未經(jīng)身份驗(yàn)證的用戶執(zhí)行受 CLP 保護(hù)的操作。

例如,如果您想允許經(jīng)過(guò)身份驗(yàn)證的用戶從您的應(yīng)用程序中查找并獲取公告,并且您的管理員角色擁有所有特權(quán),您可以設(shè)置 CLP:

// POST https://my-moralis-dapp.com/schemas/Announcement
// Note: You need to use PUT http method if the class already exists
// Set the X-Parse-Application-Id and X-Parse-Master-Key header
// body:
{
  "classLevelPermissions":
  {
    "find": {
      "requiresAuthentication": true,
      "role:admin": true
    },
    "get": {
      "requiresAuthentication": true,
      "role:admin": true
    },
    "create": { "role:admin": true },
    "update": { "role:admin": true },
    "delete": { "role:admin": true }
  }
}

影響:

  • 未經(jīng)身份驗(yàn)證的用戶將無(wú)法執(zhí)行任何操作。
  • 經(jīng)過(guò)身份驗(yàn)證的用戶(任何具有有效 ?sessionToken ?的用戶)將能夠讀取該類中的所有對(duì)象。
  • 屬于管理員角色的用戶將能夠執(zhí)行所有操作。

警告:請(qǐng)注意,這絕不會(huì)保護(hù)您的內(nèi)容,如果您允許任何人登錄到您的服務(wù)器,每個(gè)客戶端仍然可以查詢此對(duì)象。

CLP 和 ACL 交互

類級(jí)別權(quán)限 (CLP) 和訪問(wèn)控制列表 (ACL) 都是保護(hù)您的應(yīng)用程序的強(qiáng)大工具,但它們的交互并不總是與您預(yù)期的完全一致。 它們實(shí)際上代表了兩個(gè)獨(dú)立的安全層,每個(gè)請(qǐng)求都必須通過(guò)這些層才能返回正確的信息或進(jìn)行預(yù)期的更改。 這些層,一個(gè)在類級(jí)別,一個(gè)在對(duì)象級(jí)別,如下所示。 請(qǐng)求必須通過(guò)兩層檢查才能獲得授權(quán)。 請(qǐng)注意,盡管行為類似于 ACL,但指針權(quán)限是一種類級(jí)別權(quán)限,因此請(qǐng)求必須通過(guò)指針權(quán)限檢查才能通過(guò) CLP 檢查。

clp_vs_acl_diagram

如您所見,當(dāng)您同時(shí)使用 CLP 和 ACL 時(shí),用戶是否有權(quán)發(fā)出請(qǐng)求會(huì)變得很復(fù)雜。 讓我們看一個(gè)示例,以更好地了解 CLP 和 ACL 如何交互。 假設(shè)我們有一個(gè) Photo 類,其中包含一個(gè)對(duì)象 photoObject。 我們的應(yīng)用中有 2 個(gè)用戶,user1 和 user2。 現(xiàn)在假設(shè)我們?cè)?nbsp;Photo 類上設(shè)置了 Get CLP,禁用公共 Get,但允許 user1 執(zhí)行 Get。 現(xiàn)在讓我們?cè)?nbsp;photoObject 上設(shè)置一個(gè) ACL 以允許讀取 - 包括 GET - 僅用于 user2。

您可能期望這將允許 user1 和 user2 都獲取 photoObject,但是由于身份驗(yàn)證的 CLP 層和 ACL 層始終有效,因此實(shí)際上它使 user1 和 user2 都無(wú)法獲取 photoObject。如果 user1 嘗試獲取 photoObject,它會(huì)通過(guò) CLP 層的認(rèn)證,但會(huì)因?yàn)闆](méi)有通過(guò) ACL 層而被拒絕。同理,如果 user2 試圖獲取 photoObject,也會(huì)在 CLP 認(rèn)證層被拒絕。

現(xiàn)在讓我們看一個(gè)使用指針權(quán)限的示例。假設(shè)我們有一個(gè)帶有對(duì)象 myPost 的 Post 類。我們的應(yīng)用中有兩個(gè)用戶,poster 和 viewer。假設(shè)我們添加了指針權(quán)限,允許 Post 類的 Creator 字段中的任何人對(duì)該對(duì)象進(jìn)行讀寫訪問(wèn),而對(duì)于 myPost 對(duì)象,poster 是該字段中的用戶。對(duì)象上還有一個(gè) ACL,為查看器提供讀取訪問(wèn)權(quán)限。您可能期望這將允許發(fā)布者閱讀和編輯 myPost,并且查看者可以閱讀它,但是查看者將被指針權(quán)限拒絕,并且發(fā)布者將被 ACL 拒絕,所以同樣,兩個(gè)用戶都無(wú)法訪問(wèn)目的。

由于 CLP、指針權(quán)限和 ACL 之間的復(fù)雜交互,我們建議在一起使用它們時(shí)要小心。僅使用 CLP 來(lái)禁用特定請(qǐng)求類型的所有權(quán)限,然后將指針權(quán)限或 ACL 用于其他請(qǐng)求類型通常很有用。例如,您可能希望為 Photo 類禁用 Delete,但隨后在 Photo 上放置一個(gè)指針權(quán)限,以便創(chuàng)建它的用戶可以編輯它,而不是刪除它。由于指針權(quán)限和 ACL 交互的方式特別復(fù)雜,我們通常建議只使用這兩種安全機(jī)制中的一種。

安全邊緣案例

Moralis 中有一些特殊的類不遵循與其他所有類相同的所有安全規(guī)則。 并非所有類都完全遵循類級(jí)別權(quán)限 (CLP) 或訪問(wèn)控制列表 (ACL) 的定義方式,這里記錄了這些例外情況。

這里,“正常行為”是指 CLP 和 ACL 正常工作,而其他特殊行為在腳注中描述。

   ?_User?  ?_Installation?
 Get  normal behavior [1, 2, 3]  ignores CLP, but not ACL
 Find  normal behavior [3]  master key only [6]
 Create  normal behavior [4]  ignores CLP
 Update  normal behavior [5]  ignores CLP, but not ACL [7]
 Delete  normal behavior [5]  master key only [7]
 Add Field  normal behavior  normal behavior

  1. 登錄或 REST API 中的 ?/server/login? 不尊重用戶類上的 Get CLP。登錄僅基于用戶名和密碼,不能使用 CLP 禁用。
  2. 檢索當(dāng)前用戶,或基于會(huì)話令牌成為用戶,這在 REST API 中都是 ?/server/users/me?,不尊重用戶類上的 Get CLP。
  3. 讀取 ACL 不適用于登錄用戶。例如,如果所有用戶的 ACL 都禁用了讀取,那么對(duì)用戶執(zhí)行查找查詢?nèi)詫⒎祷氐卿浻脩?。但是,如果禁?nbsp;Find CLP,則嘗試對(duì)用戶執(zhí)行查找仍將返回錯(cuò)誤。
  4. 創(chuàng)建 CLP 也適用于注冊(cè)。因此,在用戶類上禁用 Create CLPs 也會(huì)禁止人們?cè)跊](méi)有主密鑰的情況下進(jìn)行注冊(cè)。
  5. 用戶只能更新和刪除自己。更新和刪除的公共 CLP 可能仍然適用。例如,如果您禁用用戶類的公共更新,則用戶無(wú)法編輯自己。但無(wú)論用戶的寫入 ACL 是什么,該用戶仍然可以更新或刪除自己,其他用戶不能更新或刪除該用戶。然而,與往常一樣,使用主密鑰允許用戶更新其他用戶,而與 CLP 或 ACL 無(wú)關(guān)。
  6. 獲取安裝請(qǐng)求通常遵循 ACL。除非您提供 ?installationId ?作為約束,否則不允許查找沒(méi)有主密鑰的請(qǐng)求。

云代碼中的數(shù)據(jù)完整性

對(duì)于大多數(shù)應(yīng)用程序,您只需要關(guān)心密鑰、類級(jí)權(quán)限和對(duì)象級(jí) ACL 即可確保您的應(yīng)用程序和用戶數(shù)據(jù)的安全。但是,有時(shí),您會(huì)遇到它們還不夠的邊緣情況。對(duì)于其他一切,有 Cloud Code。

Cloud Code 允許您將 JavaScript 上傳到 Moralis 的服務(wù)器,我們將為您運(yùn)行它。與在用戶設(shè)備上運(yùn)行的可能已被篡改的客戶端代碼不同,Cloud Code 保證是您編寫的代碼,因此可以承擔(dān)更多責(zé)任。

Cloud Code 的一個(gè)特別常見的用例是防止存儲(chǔ)無(wú)效數(shù)據(jù)。對(duì)于這種情況,惡意客戶端不能繞過(guò)驗(yàn)證邏輯尤為重要。

要?jiǎng)?chuàng)建驗(yàn)證函數(shù),Cloud Code 允許您為您的類實(shí)現(xiàn) beforeSave 觸發(fā)器。每當(dāng)保存對(duì)象時(shí)都會(huì)運(yùn)行這些觸發(fā)器,并允許您修改對(duì)象或完全拒絕保存。例如,這是您創(chuàng)建 Cloud Code beforeSave 觸發(fā)器以確保每個(gè)用戶都設(shè)置了電子郵件地址的方式:

Moralis.Cloud.beforeSave('_User', request => {
  const user = request.object;
  if (!user.get("email")) {
    throw "Every user must have an email address.";
  }
});

驗(yàn)證可以鎖定您的應(yīng)用程序,以便只接受某些值。 您還可以使用 afterSave 驗(yàn)證來(lái)規(guī)范化您的數(shù)據(jù)(例如,以相同的方式格式化所有電話號(hào)碼或貨幣)。 您可以保留直接從客戶端應(yīng)用程序訪問(wèn) Moralis 數(shù)據(jù)的大部分生產(chǎn)力優(yōu)勢(shì),但您也可以動(dòng)態(tài)為您的數(shù)據(jù)強(qiáng)制執(zhí)行某些不變量。

需要驗(yàn)證的常見場(chǎng)景包括:

  • 確保電話號(hào)碼的格式正確。
  • 清理數(shù)據(jù),使其格式標(biāo)準(zhǔn)化。
  • 確保電子郵件地址看起來(lái)像真實(shí)的電子郵件地址。
  • 要求每個(gè)用戶指定特定范圍內(nèi)的年齡。
  • 不允許用戶直接更改計(jì)算字段。
  • 除非滿足某些條件,否則不允許用戶刪除特定對(duì)象。

在云代碼中實(shí)現(xiàn)業(yè)務(wù)邏輯

雖然驗(yàn)證在 Cloud Code 中通常很有意義,但某些操作可能特別敏感,應(yīng)盡可能小心謹(jǐn)慎。在這些情況下,您可以完全刪除客戶端的權(quán)限或邏輯,而是將所有此類操作集中到 Cloud Code 函數(shù)中。

當(dāng)調(diào)用云代碼函數(shù)時(shí),它可以使用可選的 {?useMasterKey:true?} 參數(shù)來(lái)獲得修改用戶數(shù)據(jù)的能力。使用主密鑰,您的 Cloud Code 函數(shù)可以覆蓋任何 ACL 并寫入數(shù)據(jù)。這意味著它將繞過(guò)您在前面部分中設(shè)置的所有安全機(jī)制。

假設(shè)您希望允許用戶“喜歡”一個(gè) Post 對(duì)象,而不給予他們對(duì)該對(duì)象的完全寫入權(quán)限。您可以通過(guò)讓客戶端調(diào)用 Cloud Code 函數(shù)而不是修改 Post 本身來(lái)做到這一點(diǎn):

應(yīng)謹(jǐn)慎使用萬(wàn)能鑰匙。僅在需要安全覆蓋的單個(gè) API 函數(shù)調(diào)用中將 ?useMasterKey ?設(shè)置為 ?true?:

Moralis.Cloud.define("like", async request => {
  var post = new Moralis.Object("Post");
  post.id = request.params.postId;
  post.increment("likes");
  await post.save(null, { useMasterKey: true })
});

Cloud Code 的一個(gè)非常常見的用例是向特定用戶發(fā)送推送通知。 一般來(lái)說(shuō),不能信任客戶端直接發(fā)送推送通知,因?yàn)樗麄兛梢孕薷木瘓?bào)文本,或推送給他們不應(yīng)該發(fā)送的人。 您的應(yīng)用程序設(shè)置將允許您設(shè)置是否啟用“客戶端推送”; 我們建議您確保它已被禁用。 相反,您應(yīng)該編寫 Cloud Code 函數(shù),在發(fā)送推送之前驗(yàn)證要推送和發(fā)送的數(shù)據(jù)。

客戶端類創(chuàng)建

默認(rèn)情況下,Moralis 允許任何 SDK 用戶通過(guò)創(chuàng)建新類和更改現(xiàn)有類的結(jié)構(gòu)來(lái)修改數(shù)據(jù)庫(kù)。

這在開發(fā)階段非常有用,但在您投入生產(chǎn)時(shí)應(yīng)該關(guān)閉,以保護(hù)您的數(shù)據(jù)庫(kù)免受垃圾郵件的影響(以防有人使用 SDK 用新的類填充您的數(shù)據(jù)庫(kù)或向現(xiàn)有列添加大量列)。

這可以在服務(wù)器設(shè)置中完成。

Screenshot 2021-11-02 at 19

總結(jié)

Moralis 為您提供了多種方法來(lái)保護(hù)應(yīng)用程序中的數(shù)據(jù)。在構(gòu)建應(yīng)用程序并評(píng)估要存儲(chǔ)的數(shù)據(jù)類型時(shí),您可以決定選擇哪種實(shí)現(xiàn)方式。

您應(yīng)用程序中的大多數(shù)類都屬于幾個(gè)易于保護(hù)的類別之一。對(duì)于完全公開的數(shù)據(jù),您可以使用類級(jí)別的權(quán)限來(lái)鎖定表,使其不受任何人的公開可讀和可寫。對(duì)于完全私有的數(shù)據(jù),您可以使用 ACL 來(lái)確保只有擁有數(shù)據(jù)的用戶才能讀取它。但有時(shí),您會(huì)遇到不想要完全公開或完全私有的數(shù)據(jù)的情況。例如,您可能有一個(gè)社交應(yīng)用程序,其中您有一個(gè)用戶的數(shù)據(jù),這些數(shù)據(jù)應(yīng)該僅供他們認(rèn)可的朋友閱讀。為此,您需要結(jié)合本指南中討論的技術(shù)來(lái)準(zhǔn)確啟用您想要的共享規(guī)則。

我們希望您能使用這些工具盡一切可能保護(hù)您的應(yīng)用數(shù)據(jù)和用戶數(shù)據(jù)的安全。一起,我們可以讓網(wǎng)絡(luò)成為一個(gè)更安全的地方。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)