0

目前我有两个控制器操作:一个基于唯一标识符显示强类型视图,另一个更改模型。这是一些代码来可视化我的意思:

[HttpGet]
[ActionName("Edit")]
public ActionResult UpdateDevice(string code)
{
    // Request the device based on the code.
    var device = GetDeviceModel(code);

    // Present the device in a view.
    return View(device);
}

[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
}

该代码标识设备,但也可以更改它。这就是我的问题:在 post 方法中,我可以使用 访问代码model.Code,但我还需要知道代码才能更改它。

我尝试了几种替代方案,但没有一个能满足我的要求:

  • ViewData在发布之前不会持续存在。
  • TempData是基于 Sessions 或 Cookies 的——目前我都不想使用它们。
  • 隐藏字段和模型绑定不是一个选项,因为它们可以在客户端进行操作。

最后,我尝试从查询字符串中请求数据,如下所示:

[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
    var oldCode = Request.QueryString["code"];
}

这行得通!但是我没有在网上找到任何关于此的资源。所以我的问题是:在 post 操作中使用查询字符串是否可以防止修改?什么(如果有的话)条件是这样的?

如果这不是“记住”代码的有效方式,还有其他选择吗?

4

3 回答 3

0

我认为您可以在DeviceModelname中创建另一个属性OldCode

在您看来,您可以像这样将此值保存在隐藏字段中

@Html.HiddenFor(m=>m.OldCode)

现在在控制器 post 方法中,您可以获得这样的两个值。

[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
    var oldcode=model.OldCode;
    var newcode=model.Code;            
}

希望这可以帮助...

于 2013-10-17T12:23:47.177 回答
0

根据您在问题中提到的要求,您似乎正在寻找案例中的安全性。所以我会说这QueryString是不安全的。在我看来,使用Session变量是将关键数据保存在安全位置的适当方法。你可以使用这样的方法

[HttpGet]
[ActionName("Edit")]
public ActionResult UpdateDevice(string code)
{
    Session["code"] = code;
    ....
}

[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
    if (Session["code"] == null)
       throw new Exception("Error Message.");
    var code = Session["code"].ToString();
    ....
    Session["code"] = null;
}      
于 2013-10-17T13:22:20.477 回答
0

通过 GET 或 POST 请求提交的任何内容都不会被修改。虽然 GET 查询字符串显然很容易修改,但也不需要花费太多精力来欺骗 POST 变量。在我看来,您需要重新考虑您的方法。

最佳情况下,您将在服务器端进行权限检查,以确定是否允许用户使用传递的(旧)代码更新设备。如果他们没有权限,则返回错误,例如 HTTP 550 代码。

如果您真的不能支持这种方法,我建议按照其他人的建议将“OldCode”字段添加到 DeviceModel 类中,但在将其发送给客户端之前对其进行加密。然后您可以安全地将其写入隐藏字段,并在服务器上解密,而不必担心用户更改值。

于 2013-10-17T14:17:46.560 回答