【问题标题】:Can user change input from readonly to editable?用户可以将输入从只读更改为可编辑吗?
【发布时间】:2012-12-04 15:26:53
【问题描述】:

我将 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 呢?如何控制?

【问题讨论】:

  • 请不要将“ASP.NET MVC”简单地称为“MVC”。一种是框架,另一种是与语言无关的设计模式。这就像调用 IE - “互联网”
  • 你考虑过考虑javascript

标签: asp.net-mvc html.textboxfor


【解决方案1】:

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

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

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

在 cmets 之后编辑

一些建议。

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

【讨论】:

  • GiftCardId 由数据库生成并发送给视图。但是,如果表单在给定的 GiftCardId 上发布了更新并且用户更改了 GiftCardId,那么错误的记录将被更新。那么如何保证客户端的用户没有更改 GiftCardId 呢?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 2013-07-29
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2015-02-28
    相关资源
    最近更新 更多