微软的文档“ASP.NET核心服务器的威胁缓解指南”中的"事件“部分说:”事件为Blazor应用程序提供了一个入口点。保护web应用程序中端点的规则同样适用于Blazor应用程序中的事件处理。恶意客户端可以发送它希望发送的任何数据作为事件的有效负载。“
请帮我理解一下。假设我们在Blazor服务器(而不是组件)上,存在ASP.Net核心标识,并且所有Blazor页面都使用@属性授权或标记进行安全保护。因此,身份验证和授权已经到位,但是我们还需要确保某些用户只看到数据库中的某些数据。
case #1,一个参数为的Blazor组件
此参数由其父页面提供。加载组件时,将根据参数进行数据库调用以获取数据:
[Parameter] public Guid companyGuid { get; set; }
protected override async Task OnInitializedAsync()
{
using var context = DataService.CreateDbContext();
var company = await DataService.GetCompanyByGuid(companyGuid, context);
}案例2,下拉列表显示要从中选择的选择值。
数据源是基于用户权限预先填充的列表。当下拉更改事件触发时,将根据新的选择从数据库中获取数据:
<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“:
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太陌生了,所以可能还有一种滥用它的方法。这就是我的问题。
发布于 2022-11-21 12:23:44
问题:用户可以在第1种情况下修改参数吗
用户的状态保存在一个电路中的服务器内存中。在电路中保持用户状态的例子包括:
因此,要更改用户信息,您必须能够访问服务器的RAM,而不必担心这一点。
对于用户正在积极创建的瞬态数据,常用的存储位置是浏览器的localStorage和sessionStorage集合:
第三方NuGet包为使用localStorage和sessionStorage提供了API。值得考虑选择一个透明使用ASP.NET核心数据保护的包。数据保护加密存储的数据,降低篡改存储数据的潜在风险。
有关更多信息,您可以参考ASP.NET核心Blazor状态管理和浏览器存储(本地存储/会话存储)。
一般来说,如果您想拥有一个非常安全的应用程序,那么您必须添加许多这样的管理费用,比如您自己给出的示例。
https://stackoverflow.com/questions/74512240
复制相似问题