在后期操作中使用查询字符串是否安全?

时间:2013-10-17 12:13:49

标签: c# asp.net-mvc http http-post query-string

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

[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访问 new 代码,但我还需要知道代码,才能够改变它。

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

  • ViewData在帖子之前不会保留。
  • TempData基于会话或Cookie - 我现在不想使用它们。
  • 隐藏字段和模型绑定不是一个选项,因为它们可以在客户端进行操作。

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

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

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

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

3 个答案:

答案 0 :(得分:0)

我认为您可以在DeviceModel名称OldCode内创建另一个媒体资源。

并且在您的视图中,您可以将此值保存在隐藏字段中,如此

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

现在在控制器发布方法中,您可以获得这两个值。

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

希望这会有所帮助......

答案 1 :(得分: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;
}      

答案 2 :(得分:0)

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

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

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