用户可以将输入从只读更改为可编辑吗?

时间:2012-12-02 06:28:59

标签: asp.net-mvc html.textboxfor

我正在使用MVC作为我的数据输入表单,我有以下div:

<div>
      <label>Bar Code:</label>
      @if (Model.GiftCardId == default(int))
      {
        @Html.TextBoxFor(model => model.BarCode)
      }
      else
      { 
        @Html.TextBoxFor(model => model.BarCode, new { @readonly="readonly"})
      }
</div>

在这里,我确保如果用户输入新的礼品卡,则会显示可编辑的输入以允许用户输入新的条形码。但是,如果用户正在编辑现有的礼品卡,则输入必须显示为只读输入。我的问题是:用户可以改变barCode输入的readonly属性并允许自己输入另一个吗? BarCode字段不是表中的主键,但必须是唯一的。我使用GiftCardId字段来识别记录。但是,在提交表单时,还有什么可以阻止用户更改GiftCardId?如何控制?

2 个答案:

答案 0 :(得分:1)

我理解这是一个与安全相关的问题:即。用户可以破解表单,使用你不想要的东西。

答案是肯定的,用户可以使用像Firebug这样的工具来干扰标记,从而改变readonly属性。

您没有显示如何从用户收集GiftCardId。假设它是在先前的视图/操作方法中收集和验证的,更安全的方法是根据GiftCardId是否有效而重定向到不同的视图。

评论后修改

一些建议。

  • 将GiftCardId存储在会话状态中,而不是将其发送到浏览器。
  • 使用单向散列函数从GiftCardId生成令牌,并将其发送到隐藏字段中的浏览器。重新发布回发的GiftCardId并检查它是否与原始哈希匹配。有关创建MD5哈希的信息,请参阅此short article

答案 1 :(得分:0)

简单的答案是“是”,所有请求都可以伪造,这就是为什么你永远不应该信任用户输入并验证服务器端的用户输入。

您可以做的事情取决于您的需求以及GiftCardId的修改含义。除了服务器端验证之外你还可以做的事情,

1. hide the field instead of making it visible
2. encrypt the GiftCardId