1

我将 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 输入的只读属性并允许自己输入不同的吗?BarCode 字段不是表中的主键,但它必须是唯一的。我使用 GiftCardId 字段来识别记录。但是,在提交表单时,如何阻止用户更改 GiftCardId 呢?这怎么能控制?

4

2 回答 2

2

我理解这是一个与安全相关的问题:即。用户可以破解表单来做一些你不想要的事情。

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

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

评论后编辑

几个建议。

  • 将 GiftCardId 存储在会话状态中,而不是将其发送到浏览器。
  • 使用单向散列函数从 GiftCardId 生成令牌并将其发送到隐藏字段中的浏览器。重新散列回传的 GiftCardId 并检查它是否与原始散列匹配。请参阅这篇关于创建 MD5 哈希的简短文章。
于 2012-12-02T10:33:02.950 回答
0

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

您可以做什么实际上取决于您需要什么以及修改 GiftCardId 的含义。除了服务器端验证之外,您还可以做的事情,

1. hide the field instead of making it visible
2. encrypt the GiftCardId
于 2012-12-03T07:57:35.177 回答