我在MVC控制器中有一个简单的post方法,用于检查ModelState是否有效,然后调用另一个方法将模型实例作为参数传递。该模型包含通过查看Fiddler轻松获得的敏感数据。我的目标是以某种方式屏蔽或加密这些数据,以便在http跟踪中看不到它。
我看到过建议使用Session或Temp变量的帖子,但在我的情况下这不是一个选项。
这就是代码的样子:
[HttpPost]
[ActionName("Search")]
[AccessControl(Xri)]
public ActionResult SearchPost(string string1, ViewModel model)
{
model.NoResults = false;
if (ModelState.IsValid)
{
if (ModelState.IsValid) return RedirectToAction("TargetAction", model);
}
}
[AccessControl(Xri)]
public ActionResult TargetAction(string arg, ViewModel viewModel)
{
.
.
.
}
Fiddler展示了以下内容:
/ TargetAction ID = 01010101&安培;日期= 08%2F14%2F2013%2000%3A00%3A00&安培;为了= 08%2F21%2F2013%2000%3A00%3A00&安培;参数1 = someValue中&安培; param2的= somevalue2
有没有办法屏蔽这里显示的网址参数?
答案 0 :(得分:1)
您需要在服务器上运行SSL。
如果没有来自受信任机构的服务器证书,您几乎无法通过线路加密数据。为什么?因为您需要在开始发送数据之前以明文形式发送加密/解密详细信息,以便您的客户端(可能是JavaScript)可以对其进行解码。
使用证书并在443上运行,为您提供服务器/浏览器的内置功能,这在自定义实现中很难被击败。
如果您只想隐藏数据(并将其置于大多数Web用户的水平之外),您可以始终对数据进行base64编码,而不是对其进行加密。 请注意,您不是在加密数据,而且仍然可以对其进行解码。此方法不是加密形式。
如果你决定采用这种方法,这里有一些资源: Client-side Encoding/Decoding MSDN Reference on Encoding to Base64
干杯。
答案 1 :(得分:0)
您有两种选择:
将数据存储在服务器上,并为用户提供一个令牌(例如GUID)以传递以检索数据。由于使用Session或TempData不是一个选项,您可以将viewmodel存储在数据库中,然后使用URL中的令牌重定向用户,以便在下一个请求时检索它。
另一个选项是让用户像您当前一样在URL中传递viewmodel,但是以加密格式传递它。例如,你可以 将模型序列化为JSON,使用.NET的内置加密算法对其进行加密,然后重定向到下一个操作,将加密的字符串作为视图模型传递。然后,您可以将目标操作更改为:
[AccessControl(Xri)] public ActionResult TargetAction(string arg, string encryptedViewModel) { var decryptedString = Decrypt(encryptedViewModel) ; // supply the decrypt function to match your encryption var viewModel = JsonConvert.DeserializeObject(decryptedString); }