删除用户的可调用云功能是否会被滥用,以便仅通过 ID 删除用户?
Could a callable cloud function that delete users be abused so it can delete users by only id?
我在前端有一个可调用的云函数,它从前端获取子用户 ID 并将其传递给云函数,然后云函数删除该用户并从集合中删除他的文档。 ..
我的问题是有人可以获取某个用户的 ID 并使用该功能并开始使用此功能弹出请求以左右删除用户吗?
这可能会不遵循任何规则运行是有道理的,所以我认为如果以错误的方式实施,这将是一个主要的安全风险,不知道如何提高这方面的安全性并防止任何滥用企图。
前端可调用函数
const functions = getFunctions();
const deleteClient = httpsCallable(functions, 'deleteClient');
deleteClient({ uid: 'clientId' })
.then((result: any) => {
// Read result of the Cloud Function.
/** @type {any} */
// const data = result.data;
// const sanitizedMessage = data.text;
console.log(result);
})
.catch((err: any) => {
alert(err);
});
云函数
export const deleteClient = functions.https.onCall((data, context) => {
admin
.auth()
.deleteUser(data.uid)
.then(() => {
console.log('Successfully deleted user');
})
.catch((error: any) => {
console.log('Error deleting user:', error);
});
db.collection('ClientsData').doc(data.uid).delete();
});
听起来您确实造成了安全风险,这也正是为什么 Firebase 身份验证只允许在其 client-side SDK 中删除当前 signed-in 用户的原因。
您必须在 Cloud Functions 代码中实施某种授权方案。这需要两个步骤:
- 将发出呼叫的 signed-in 用户的身份从客户端传递到服务器,并在那里使用它来确定谁在发出呼叫。由于您使用的是 Callable Cloud Functions,这已经为您完成,用户在您的 Cloud Functions 代码中的
context.auth
变量中可用。
- 判断用户是否被授权执行该操作。这通常是通过拥有授权用户列表,然后检查拨打电话的
context.auth.uid
是否在该列表中来完成的。当然,该列表也可以存储在您的数据库中,这样您就可以在不更改代码的情况下更新它。
我在前端有一个可调用的云函数,它从前端获取子用户 ID 并将其传递给云函数,然后云函数删除该用户并从集合中删除他的文档。 ..
我的问题是有人可以获取某个用户的 ID 并使用该功能并开始使用此功能弹出请求以左右删除用户吗?
这可能会不遵循任何规则运行是有道理的,所以我认为如果以错误的方式实施,这将是一个主要的安全风险,不知道如何提高这方面的安全性并防止任何滥用企图。
前端可调用函数
const functions = getFunctions();
const deleteClient = httpsCallable(functions, 'deleteClient');
deleteClient({ uid: 'clientId' })
.then((result: any) => {
// Read result of the Cloud Function.
/** @type {any} */
// const data = result.data;
// const sanitizedMessage = data.text;
console.log(result);
})
.catch((err: any) => {
alert(err);
});
云函数
export const deleteClient = functions.https.onCall((data, context) => {
admin
.auth()
.deleteUser(data.uid)
.then(() => {
console.log('Successfully deleted user');
})
.catch((error: any) => {
console.log('Error deleting user:', error);
});
db.collection('ClientsData').doc(data.uid).delete();
});
听起来您确实造成了安全风险,这也正是为什么 Firebase 身份验证只允许在其 client-side SDK 中删除当前 signed-in 用户的原因。
您必须在 Cloud Functions 代码中实施某种授权方案。这需要两个步骤:
- 将发出呼叫的 signed-in 用户的身份从客户端传递到服务器,并在那里使用它来确定谁在发出呼叫。由于您使用的是 Callable Cloud Functions,这已经为您完成,用户在您的 Cloud Functions 代码中的
context.auth
变量中可用。 - 判断用户是否被授权执行该操作。这通常是通过拥有授权用户列表,然后检查拨打电话的
context.auth.uid
是否在该列表中来完成的。当然,该列表也可以存储在您的数据库中,这样您就可以在不更改代码的情况下更新它。