【问题标题】:How to handle query string in Asp.net MVC 5如何在 Asp.net MVC 5 中处理查询字符串
【发布时间】:2018-08-03 09:32:36
【问题描述】:

我有一个 ASP.NET MVC 5 网站。我在设计表格时使用了操作链接来显示数据列表。从该操作链接导航时,我已将类对象作为参数传递。访问该链接后,它会将该对象参数解析为长查询字符串,从而在 URL 中公开数据。

在 MVC 中处理查询字符串的方法是什么?

是否可以隐藏查询字符串或将对象作为参数传递而不将其暴露在 URL 中的方式?

【问题讨论】:

  • 不,你不能。只有一个选项是加密
  • @CoolJK 如果您从浏览器发送数据,则数据加密是无用的,因为加密代码和使用的任何密钥对任何检查页面源代码的人都是可见的他们的浏览器工具。除非你在谈论使用 HTTPS?虽然这并没有从查询字符串中删除数据,它仍然可以由网络服务器记录,但它确实(在很大程度上)阻止了它在旅途中被 MITM'd。 HTTPS 加上请求正文中的数据而不是查询字符串的 POST 请求可能是最明智的选择。
  • @ADyson 如何使用 HTTPs?
  • 通过正确设置您的网络服务器以通过 HTTPs 为站点提供服务并为其获取有效的 SSL 证书。这不是您在应用程序代码本身中执行的任务。您实际上并不需要在您的本地主机或测试环境中执行此操作,但您当然应该为您的站点的实时版本执行此操作。
  • @ADyson 谢谢!!

标签: asp.net-mvc asp.net-mvc-5


【解决方案1】:

您不能隐藏查询字符串,它是 URL 的一部分。你可以加密它。

一种解决方案是使用 POST 请求而不是 GET。然后您可以在请求正文中发送数据,它不会显示在 URL 中。但如果您检查网络流量(例如,如果您在客户端计算机上运行 Fiddler),它仍然可以访问。

另一种解决方案是仍然使用 GET 请求,但不是传递所有数据,而是传递一个 ID,然后使用此 ID 从数据库再次加载数据。请注意,此 ID 也可能被欺骗,因此请确保用户实际上具有请求此 ID 的权限。

@Html.ActionLink("Show details", "Details", "Data", new { dataId = Model.Id })

[HttpGet]
public ActionResult Details(long dataId) {
    var data = _dbContext.Data.Find(dataId);
    var vm = new DataDetailsViewModel(data);
    return View("Details", vm);
} 

【讨论】:

  • 可能还值得建议使用 HTTPS 来加密连接,如果它还没有被使用的话,这样网络流量就不会那么容易被嗅探了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多