首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Blazor如何正确地保护事件?

Blazor如何正确地保护事件?
EN

Stack Overflow用户
提问于 2022-11-20 21:42:25
回答 1查看 32关注 0票数 1

微软的文档“ASP.NET核心服务器的威胁缓解指南”中的"事件“部分说:”事件为Blazor应用程序提供了一个入口点。保护web应用程序中端点的规则同样适用于Blazor应用程序中的事件处理。恶意客户端可以发送它希望发送的任何数据作为事件的有效负载。“

请帮我理解一下。假设我们在Blazor服务器(而不是组件)上,存在ASP.Net核心标识,并且所有Blazor页面都使用@属性授权或标记进行安全保护。因此,身份验证和授权已经到位,但是我们还需要确保某些用户只看到数据库中的某些数据。

case #1,一个参数为的Blazor组件

此参数由其父页面提供。加载组件时,将根据参数进行数据库调用以获取数据:

代码语言:javascript
运行
复制
[Parameter] public Guid companyGuid { get; set; }

protected override async Task OnInitializedAsync()
{
    using var context = DataService.CreateDbContext();
    var company = await DataService.GetCompanyByGuid(companyGuid, context);
}

案例2,下拉列表显示要从中选择的选择值。

数据源是基于用户权限预先填充的列表。当下拉更改事件触发时,将根据新的选择从数据库中获取数据:

代码语言:javascript
运行
复制
<RadzenDropDown Data=@DataSourceCompanies TValue="Company" 
@bind-Value="@selectedCompany"
Change="@(args => CompanySelectionChanged(args as Company))" />

List<Company> DataSourceCompanies = await GetCompaniesAndObserveUserPermissions(userGuid);

async void CompanySelectionChanged(Company c)
{
    using var context = DataService.CreateDbContext();
    var company = await DataService.GetCompanyByGuid(c.guid, context);
}

问题:用户可以在第1种情况下修改参数,或者在第2种情况下修改下拉列表中的选定项吗?

换句话说,我是否还需要通过这样的操作来保护数据库查询"GetCompanyByGuid“:

代码语言:javascript
运行
复制
var authState = await authenticationStateTask;
string? userId = authState.User.FindFirst(c => c.Type.Contains("nameidentifier"))?.Value;
var company = await DataService.GetCompanyByGuid(c.guid, userId, context);

(然后使用数据库查询中的userId来额外保护查询)

虽然这听起来“更安全”,但感觉真的很麻烦。在整个应用程序中,有100多个地方进行数据库调用。我想确认一下这个额外的代码是否真的有必要?

谢谢!

我读过微软的文档,但我不太清楚它的意思。尝试了浏览器调试模式来检查应用程序,我只看到HTML/css (如预期的那样)。没有任何内部应用程序数据允许我修改应用程序的行为是可见的,例如公司guids。但是我对SignalR太陌生了,所以可能还有一种滥用它的方法。这就是我的问题。

EN

回答 1

Stack Overflow用户

发布于 2022-11-21 12:23:44

问题:用户可以在第1种情况下修改参数吗

用户的状态保存在一个电路中的服务器内存中。在电路中保持用户状态的例子包括:

  • 组件实例的层次结构及其在呈现UI中的最新呈现输出。
  • 组件实例中字段和属性值。

因此,要更改用户信息,您必须能够访问服务器的RAM,而不必担心这一点。

对于用户正在积极创建的瞬态数据,常用的存储位置是浏览器的localStorage和sessionStorage集合:

  • localStorage的作用域位于浏览器的窗口。如果用户重新加载页面或关闭并重新打开浏览器,状态将保持不变.如果用户打开多个浏览器选项卡,则在选项卡之间共享状态。数据在localStorage中一直存在,直到显式清除为止。
  • sessionStorage的作用域为“浏览器”选项卡。如果用户重新加载选项卡,状态将保持不变。如果用户关闭选项卡或浏览器,则状态将丢失。如果用户打开多个浏览器选项卡,则每个选项卡都有自己独立的数据版本。

第三方NuGet包为使用localStorage和sessionStorage提供了API。值得考虑选择一个透明使用ASP.NET核心数据保护的包。数据保护加密存储的数据,降低篡改存储数据的潜在风险。

有关更多信息,您可以参考ASP.NET核心Blazor状态管理浏览器存储(本地存储/会话存储)

一般来说,如果您想拥有一个非常安全的应用程序,那么您必须添加许多这样的管理费用,比如您自己给出的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74512240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档