我目前一直在使用 Blazor-Server,并且非常喜欢它。 然而,我已经意识到很多事情是如何“在幕后”工作的,现在我对它的安全方面提出质疑......
如果我们使用微软默认的 Blazor-Server 模板并访问“Counter”页面,我们会发现它非常简单,只有以下代码:
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
此页面包含一种可以在单击按钮时调用的方法,如下所示:
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
由于大量 blazor 服务器魔法正在幕后进行,因此这种解释的高级解释是“当您单击该按钮时,Websocket 向服务器发送数据包”。 由于可能存在安全漏洞,这让我有点担心。 例如,如果我放入一个很小的 if 语句,试图达到只有管理员才能看到并单击此按钮的效果,如下所示:
@if (user == AdminRole)
{
<button class="btn btn-primary" @onclick="IncrementCountAdmin">Click me</button>
}
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
private void IncrementCountAdmin()
{
currentCount += 5;
}
}
由于这只是从客户端的 websocket 到服务器来回发送数据包,那么任何拥有数据包操作工具的客户端都无法调用此 IncrementCountAdmin 方法吗? 这对我来说非常麻烦,但是也许 blazor-server 的幕后还有更多的魔力,它还能以某种方式验证数据包?
如果有人有任何相关信息,我将不胜感激地了解有关 blazor 服务器应用程序的更多信息:)
我一直在使用默认的 blazor-server 应用程序来测试+创建此示例场景。
我只能回答你的具体问题。您实施的应用程序安全性取决于您的应用程序的要求。您可以在 UI 层和/或表示层中实现安全性。
在您给出的示例中,如果渲染按钮,则渲染器中只有一个事件连接到
IncrementCountAdmin
。因此,即使您可以进入普通用户的 SignalR 会话(困难),并尝试将单击事件发送到渲染器,也没有连接事件侦听器来调用 IncrementCountAdmin
。