0

我有一个包含单选按钮列表的 ASP.NET Web 表单。每个单选按钮都有一个与之关联的值。单选按钮列表有一个验证器控件,以确保至少有一个按钮被选中。

<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() 来触发服务器端验证。然而,在这种情况下,单选按钮的验证只是一个选定的索引验证器。 没有明确检查 value 的验证器

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

4

1 回答 1

2

通过少量的实验,我确定了以下内容:

  1. 上面单选按钮的“值”确实是在表单/帖子中传递的,很容易被篡改。在我的测试应用程序中,我通过使用一些 jquery 设置它来篡改该值,但它可以在 Paros 或 MITM 中轻松修改(假设没有加密)。

  2. 在表单/post 中传递的值与 rboControl.Value 返回的值不同。事实上,获得它的唯一方法是使用 Request.Form["field name"]。

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

  4. 从 rboControl.Checked 返回的值似乎等同于表达式 (rboControl.Value == Request.Form["Field Name"])。如果该值与任何控件都不匹配,则它们都不返回 Checked = true。

  5. 无论是否为相关控件启​​用视图状态,上述所有陈述都是正确的。

  6. 无论您是否启用了页面事件验证,上述所有陈述都是正确的。

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

编辑:

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

于 2013-10-26T00:09:22.000 回答