當(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í)安全性是架構(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ā)人員。 例如:
您可以將這些權(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ù)。
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)限的表都將完全被公眾讀取。objectId
?。對(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)容的審核。
鎖定架構(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ù)。
控制誰(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)模式。 例如:
這是一個(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)限是一種特殊類型的類級(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)限。
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 }
}
}
影響:
sessionToken
?的用戶)將能夠讀取該類中的所有對(duì)象。警告:請(qǐng)注意,這絕不會(huì)保護(hù)您的內(nèi)容,如果您允許任何人登錄到您的服務(wù)器,每個(gè)客戶端仍然可以查詢此對(duì)象。
類級(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 檢查。
如您所見,當(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 |
/server/login
? 不尊重用戶類上的 Get CLP。登錄僅基于用戶名和密碼,不能使用 CLP 禁用。
/server/users/me
?,不尊重用戶類上的 Get CLP。
installationId
?作為約束,否則不允許查找沒(méi)有主密鑰的請(qǐng)求。對(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)景包括:
雖然驗(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ù)。
默認(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è)置中完成。
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è)更安全的地方。
更多建議: