有人可以解释一下服务器操作在幕后是如何工作的吗?在下面的示例中,我首先检查查看者是否有权访问该帐户,然后创建操作。这在浏览器中工作得很好。但是,如果有人伪造一个伪造“提交”调用的请求,会发生什么情况呢?我需要在操作中进行另一次检查吗?如果我在 Action 中添加另一个“if”,TypeScript 会告诉我该变量此时始终为 true,我无需担心它。这是真的还是 TypeScript 试图愚弄我? 文档说我们需要检查用户是否有权执行该操作,但示例位于组件之外。它在服务器组件中的工作方式相同吗?
async function DeleteUser({ targetUser }: Props) {
const sessionUser = await getSessionUser();
const viewerHasAccess = checkAccess(sessionUser, targetUser);
if (!viewerHasAccess) return "403 forbidden";
const submit = async () => {
"use server";
deleteUser(targetUser);
};
return (
<form action={submit}>
<input type="submit" value="Delete" />
</form>
);
}
是的,您应该始终检查是否允许用户在其中执行服务器操作。
正如 Next.js 文档所说,
您应该像对待面向公众的 API 端点一样对待服务器操作,并确保用户有权执行该操作。
在幕后,您的应用程序正在执行 POST 请求,以使用其参数和应用程序上下文调用您的
submit
操作。因此,您需要在执行任何操作之前验证请求。