You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扫描发现Reflection Injection漏洞,求Telerik Grid场景下的修复方案

Reflection Injection漏洞修复方案(针对Telerik Grid场景)

核心问题本质

你遇到的这个漏洞,是因为直接把用户可控的filter参数(对应Grid列名)传入了反射相关逻辑里。攻击者可以篡改这个参数,尝试调用非预期的字段/方法,绕过正常业务逻辑甚至搞破坏。


1. 强制白名单验证,堵死非法输入

提前把那20个合法列名做成硬编码的白名单,控制器接收到filter参数后,先检查参数是否在白名单里,不在就直接拒绝:

// 预定义合法列名的白名单
private readonly HashSet<string> ValidFilterColumns = new HashSet<string>
{
    "UserName", "Email", "CreateTime", // 替换成你的20个列名
};

public IActionResult LoadGridData(string filter)
{
    if (!ValidFilterColumns.Contains(filter))
    {
        return BadRequest("非法筛选参数");
    }
    // 继续后续正常逻辑
}

注意:白名单必须是硬编码或从可信配置读取,绝对不能从用户输入或不可信来源动态生成。

2. 把反射调用和用户参数彻底解耦

如果之前是直接用filter参数做反射(比如typeof(UserModel).GetProperty(filter)),必须改成用白名单映射好的属性信息,彻底避免用户参数直接接触反射逻辑:

// 提前映射合法列到对应的属性信息
private readonly Dictionary<string, PropertyInfo> ColumnPropertyMap = new Dictionary<string, PropertyInfo>
{
    {"UserName", typeof(UserModel).GetProperty("UserName")},
    {"Email", typeof(UserModel).GetProperty("Email")},
    // 依次添加所有合法列
};

public IActionResult LoadGridData(string filter)
{
    if (!ColumnPropertyMap.TryGetValue(filter, out var targetProperty))
    {
        return BadRequest("非法筛选参数");
    }
    // 直接用targetProperty做后续操作,不再碰用户输入的filter
}

3. 限制Telerik Grid的前端请求范围

在Razor视图的Grid配置里,明确只允许对合法列做筛选,同时限制筛选操作符,减少前端层面的风险(但不能替代后端验证,攻击者能绕前端):

@(Html.Kendo().Grid<UserModel>()
    .Name("UserGrid")
    .Columns(columns =>
    {
        columns.Bound(c => c.UserName);
        columns.Bound(c => c.Email);
        // 只配置那20个合法列
    })
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("LoadGridData", "User"))
        .Filterable(filterable => filterable
            .Extra(false) // 限制只能单字段筛选
            .Operators(operators => operators
                .ForString(str => str.Clear()
                    .Contains("包含")
                    .EqualTo("等于"))) // 只允许必要的筛选操作
        )
    )
)

4. 开启ASP.NET Core的严格参数绑定

在项目配置里启用严格绑定模式,避免意外绑定到非预期的属性,进一步加固参数校验:

// Program.cs中配置
builder.Services.AddMvc(options =>
{
    // 启用严格绑定,忽略未定义的请求参数
    options.ModelBindingExceptionsAllowed = false;
    options.AllowValidatingTopLevelNodes = true;
});

5. 修复后务必验证

  • 用Seeker重新扫描,确认漏洞已修复。
  • 手动构造恶意请求,比如传入白名单外的字段名,确认后端返回错误。
  • 定期排查项目里所有用反射的地方,避免再出现类似问题。

内容的提问来源于stack exchange,提问作者shemmige

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:52:50