Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET web窗体是否验证单选按钮值?_Asp.net_Security_Validation_Http_Webforms - Fatal编程技术网

ASP.NET web窗体是否验证单选按钮值?

ASP.NET web窗体是否验证单选按钮值?,asp.net,security,validation,http,webforms,Asp.net,Security,Validation,Http,Webforms,我有一个包含单选按钮列表的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" /> 如果

我有一个包含单选按钮列表的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流量将被删除

Country=Other
因此,该值是自由且清晰的,可以被篡改(例如,使用Paros),几乎与查询字符串可以被篡改一样容易

Country=Other'+DROP+TABLE+Users
通常在页面上调用page.Validate()来触发服务器端验证。然而,在这种情况下,单选按钮的验证只是一个选定的索引验证器没有明确检查值的验证器


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

通过少量实验,我确定了以下几点:

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

  • 表单/post中传递的值与rboControl.value返回的值不同。事实上,获取它的唯一方法是使用Request.Form[“fieldname”]

  • 从控件返回的值。值始终是标记本身中的值。因此,它不易被篡改

  • 从rboControl.Checked返回的值似乎与表达式等效(rboControl.value==Request.Form[“Field Name”])。如果该值与任何控件都不匹配,则它们都不会返回Checked=true

  • 无论是否为所讨论的控件启用了视图状态,上述所有语句都是正确的

  • 无论是否启用了页面事件验证,上述所有语句都是正确的

  • 所以为了回答我自己的问题,是的,单选按钮值通过服务器端的白名单进行验证,并且这种验证是自动进行的

    编辑:


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

    所有Web请求都可以被拦截,这就是为什么我们有SSL和参数化查询。更正:所有Web请求都可以被拦截,这就是为什么我们有SSL、参数化查询和服务器端验证。在这种情况下,该字段应该根据白名单{“US”,“Other}进行验证。我的问题是,我是否需要自己进行验证,或者框架是否为我进行验证,例如,当我调用page.Validate时(似乎不太可能),或者当框架解析表单/帖子以填充我的web控件的状态时(更有可能).我会使用一个合适的RadioButtonList和一个CustomValidator…然后你可以在服务器端实现逻辑来验证你自己。
    Country=Other'+DROP+TABLE+Users