如何限制Blazor Server Side的请求大小
三层拦截方案实现超大payload防护
1. 前端层拦截(阻止请求发往服务器)
这是成本最低的拦截方式,校验完全在浏览器本地执行,不会产生任何服务器流量:
- 给输入框增加原生
maxlength属性,浏览器会自动限制输入的最大字符数,超出内容不会被输入框接收,示例如下:
注意:该限制可被攻击者通过篡改前端代码绕过,仅作为第一道防线使用<input maxlength="2000" @bind="Text"/> - 替换默认
@bind为自定义事件处理,配合前端JS做粘贴事件拦截:监听输入框的paste事件,读取粘贴内容的长度,超过阈值直接取消粘贴操作,不会触发Blazor的服务器通信。
2. SignalR 全局传输大小限制(服务端底层兜底)
Blazor Server 基于SignalR通信,你可以直接配置SignalR的单条消息最大接收大小,超过阈值的消息会被直接拒绝,不会进入业务逻辑层,配置方式如下(.NET 6+ Program.cs中添加):
builder.Services.AddServerSideBlazor() .AddHubOptions(options => { // 配置单条消息最大为1MB,单位为字节,可根据实际业务调整阈值 options.MaximumReceiveMessageSize = 1 * 1024 * 1024; });
该配置为全局生效,所有Blazor的SignalR通信消息都会被校验,超出大小的消息会被直接丢弃,同时主动断开对应客户端连接,从通信层阻断超大payload攻击。
3. 业务层字段校验(最终兜底)
即便前两层限制被绕过,你还可以在业务层对绑定字段做长度限制,避免超大字符串占用服务器内存,示例代码如下:
<input @bind="Text"/> @code{ private string _text = string.Empty; public string Text { get => _text; set { // 限制最大长度为2000字符,超出则截断,也可根据需求抛出验证异常 _text = value?.Length > 2000 ? value.Substring(0, 2000) : value ?? string.Empty; } } }
额外注意
如果你的业务有大内容(如大文本、文件)上传需求,不要通过Blazor的双向绑定通道传输,改用传统的HTTP POST接口分片上传,避免占用SignalR通信通道的带宽和资源。
内容的提问来源于stack exchange,提问作者YaRmgl
相关产品推荐
相关产品推荐

