如何检测ASP.NET的GridView控件是否被篡改或存在无效值
ASP.NET 原生 GridView 控件不存在内置的 GridCustom.IsValid() 方法直接检测控件值篡改或无效值:默认状态下框架只会对提交的控件值做基础类型转换,对于复选框这类控件,默认合法值只有 on(选中状态)和空值(未选中状态),收到异常值也不会主动触发校验报错。
你可以通过以下几种方案实现检测需求:
方案1:在数据提交事件中逐行校验提交值
可以在 GridView 的 RowUpdating 事件、或者自定义保存按钮的点击事件中,直接读取原始请求参数校验值是否合法,避免框架自动转换漏判:
// 遍历GridView所有行校验 foreach (GridViewRow row in GridCustom.Rows) { // 读取对应行复选框的原始提交值 string rawSubmitValue = Request.Form[$"GridCustom$ctl{row.RowIndex + 1:D2}$CHK_SelRcd"]; // 仅空值和on为合法值 if (!string.IsNullOrEmpty(rawSubmitValue) && rawSubmitValue != "on") { // 检测到篡改,标记页面校验不通过,中断操作 Page.IsValid = false; break; } }
方案2:开启页面事件验证(推荐)
ASP.NET 原生自带事件验证机制,开启后会自动校验回发的控件值是否属于服务端渲染时的合法范围,篡改后会直接抛出异常拦截请求:
只需检查页面头部 @Page 指令中是否配置了 EnableEventValidation="true"(该配置默认开启,很多开发者会为了方便手动关闭,重新开启即可生效)。
方案3:自定义扩展方法实现你需要的 IsValid() 调用
可以给 GridView 编写扩展方法,封装通用的校验逻辑:
public static class GridViewExtensions { public static bool IsValid(this GridView grid, string checkBoxId = "CHK_SelRcd") { foreach (GridViewRow row in grid.Rows) { string rawValue = Request.Form[$"{grid.UniqueID}$ctl{row.RowIndex + 1:D2}${checkBoxId}"]; if (!string.IsNullOrEmpty(rawValue) && rawValue != "on") { return false; } } return true; } }
封装完成后就可以直接调用 if (!GridCustom.IsValid()) { /* 处理非法请求逻辑 */ },完全符合你期望的用法。
注意:所有校验逻辑必须放在服务端实现,客户端校验可被扫描器直接绕过,无法起到防护作用。
内容的提问来源于stack exchange,提问作者Robert Smith
相关产品推荐
相关产品推荐

