2013-10-25 24 views
0

我有一个包含一个单选按钮列表中的ASP.NET Web窗体。每个单选按钮都有一个与之相关的值。单选按钮列表具有验证器控件,以确保至少检查一个按钮。ASP.NET网页表单验证单选按钮值吗?

<input name="Country" value="US" id="CountryUS" type="radio" runat="server" /> 
<input name="Country" value="Other" id="CountryOther" type="radio" runat="server" /> 

据我所知,HTTP单选按钮转换成名称/值对,其中名称是单选按钮的名称和值相关联的值(它不是真/假)。

如果第一个单选按钮被选中,HTTP流量将是

Country=US 

以及如果所述第二个被选中时,HTTP通信将是

Country=Other 

因此,该值是自由和清楚被篡改(例如与Paros)几乎与查询字符串可能被篡改一样容易。

Country=Other'+DROP+TABLE+Users 

通常在页面上,您可以调用page.Validate()来触发服务器端验证。然而,在这种情况下,单选按钮的验证只是一个选定的索引验证器。 没有验证程序明确检查值

我怎么知道客户没有与价值篡改?它在ViewState中是否重复,并且ASP.NET会自动检查它?或者黑客可以将任何他们想要的东西放在那里,并且将一个字符串注入我的系统(除非我用代码手动验证它)?

+0

所有Web请求都可以被拦截,这就是为什么我们有SSL和参数化查询。 – IrishChieftain

+0

更正:所有Web请求都可以被拦截,这就是为什么我们有SSL,参数化查询,**和服务器端验证**。在这种情况下,字段应该根据白名单{“US”,“Other}进行验证。我的问题是我是否需要自己做这个或者框架是否为我做,例如,当我打电话给page.Validate(doesn'或者当框架解析表单/帖子来填充我的web控件的状态(更可能) –

+0

我会使用一个适当的RadioButtonList与一个CustomValidator ...然后你可以实现逻辑来验证你自己服务器端。 – IrishChieftain

回答

2

随着我已确定以下实验少量:

  1. 的单选按钮上方的形式/后确实传递的“值”,并且可以容易地被篡改。在我的测试程序,我用值篡改通过一些jQuery的设置它,但它可以很容易地在帕罗或MITM被修改(假设没有加密)。

  2. 是形式/后传递的值不是由rboControl.Value返回的值相同。实际上唯一的方法是使用Request.Form [“field name”]。

  3. 是从rboControl.Value返回的值总是在标记本身的价值。所以它不容易被篡改。

  4. 从rboControl.Checked返回的值看起来等价于表达式(rboControl.Value == Request.Form [“Field Name”])。如果该值与任何控件都不匹配,则它们都不会返回Checked = true。

  5. 无论是否为相关控件启​​用了视图状态,上述所有语句都为真。

  6. 以上所有的说法是正确的,无论是否已启用网页事件验证。

所以要回答我自己的问题,YES,单选按钮值通过服务器端的白名单进行验证,并且此验证自动发生。

编辑:

做过类似的性质,但是,下拉控制一些更多的测试。同样的发现。此外,如果您启用了页面事件验证,则如果表单/ post值与下拉列表标记中的任何项目的值不匹配(或以编程方式添加,如ViewState中持久化),则ASP将引发异常。这就是说,无法在客户端添加额外的列表项。