Validation 如何检查恶意用户没有从C#中的RadioButtonList提交禁用的ListItem?

Validation 如何检查恶意用户没有从C#中的RadioButtonList提交禁用的ListItem?,validation,selection,radiobuttonlist,Validation,Selection,Radiobuttonlist,假设我有一个RadioButtonList控件: <asp:RadioButtonList ID="rdbSubscriptionType" runat="server"> <asp:ListItem Value="Eval" Selected="True">Evaluation</asp:ListItem> <asp:ListItem Value="Monthly" Enabled="false">Monthly

假设我有一个
RadioButtonList
控件:

<asp:RadioButtonList ID="rdbSubscriptionType" runat="server">  
      <asp:ListItem Value="Eval" Selected="True">Evaluation</asp:ListItem>  
      <asp:ListItem Value="Monthly" Enabled="false">Monthly Subscription (not available yet)</asp:ListItem>  
      <asp:ListItem Value="Yearly" Enabled="false">Yearly Subscription </asp:ListItem>  
</asp:RadioButtonList> 

但我不确定恶意用户是否也可以使用Javascript或类似技术从客户端更改控件的启用状态。是否有任何最佳实践来执行此验证?

您需要考虑围绕做出“禁用”某项决策的业务规则

如果你正在做的唯一检查是基于前端返回的内容,那么你就有麻烦了。任何人都可以使用FireBug更改html值并将其发布到服务器

在服务器端代码中,您遵循什么业务规则来确定提交表单的用户是否有权执行任何给定操作


你在html中说他们不允许每月订阅。你是根据什么样的商业基础来决定的?一旦你清楚了你可以把它放进代码中,并在表单发布时检查它。

不,启用的
.Enabled
属性不能用JavaScript更改,你对你所拥有的一切都没问题(自己测试以确认)。这就是说,有一种更彻底的方法来建立这种关系:


使用单独的模型填充rdbSubscriptionType项集合(已启用、值和显示文本),然后在服务器端,与该模型进行比较,而不是与
asp:RadioButtonList
控件本身进行比较。

谢谢。因此,根据您的说法,一旦表单发回,我应该检查与特定选项的“启用/禁用”链接的业务规则。因为为了获取该检查的数据,我需要进行可能影响性能的数据库访问,所以我必须将这些“规则”保存在SessionState中。这是一个好方法吗?点击数据库进行这样的检查不应该是一个巨大的性能损失。就像Ben在下面所说的,不要相信用户的反馈。使用FireBug更改html时,请执行一些测试以查看“Enabled”属性是否被更改。验证Ben的答案并决定自己的方法需要2分钟。谢谢,这听起来是个不错的解决方案(提醒了ViewModel方法)。Jamie Dixon在回答中说,任何使用FireBug的人都可以更改HTML值并将其发布到服务器。这就是当我决定问这个问题时我害怕的。是的,杰米是正确的,你不能相信来自用户的信息。然而,在您的例子中,我们所指的.Enabled属性是服务器的一个设置,它不会在回发时被客户端覆盖。ASP.Net(按设计)混淆了客户机-服务器之间的界限,这可能会导致类似这样的混乱-解决这一问题的最干净方法是使用单独的模型并对其进行优先级排序。
if( rdbSubscriptionType.SelectedItem.Enabled == true)