【发布时间】:2019-09-09 17:12:33
【问题描述】:
我试图在我的 Web 应用程序的查询字符串中隐藏参数。 我已经能够通过使用会话来存储临时变量来做到这一点。所以它会像这样工作:
1.点击查看个人资料按钮:
href="@Url.Action("RedirectWithId", "Redirect", new { act = "ProfileView", ctrl = "User", id = member.Id})"
2。调用重定向方法并存储临时数据:
public class RedirectController : Controller
{
public ActionResult RedirectWithId(string act, string ctrl, int id)
{
Session["temp_data"] = id;
return RedirectToAction(act, ctrl);
}
}
3。在不带参数的action方法中使用:
public ActionResult ProfileView()
{
if (Session["temp_data"] == null)
{
return Redirect(Request.UrlReferrer.ToString());
}
int id = (int)Session["temp_data"];
var model = GetUserById(id);
return View(model);
}
所以它工作得很好,但是,这种隐藏参数的方法不能处理假设我转到第一个配置文件(id 4),然后转到第二个配置文件(id 8)的情况。如果从第二个配置文件我按下导航器上的后退按钮试图返回到第一个配置文件(id 4),我将被重定向到当前配置文件(id 8),因为 8 是当前值Session["temp_data"].
有没有办法处理这种特殊情况?或者是另一种完全不同的更好的方法来隐藏 URL 中的参数?
谢谢!
【问题讨论】:
-
最大的问题是,为什么首先要隐藏查询字符串参数?据推测,有问题的用户被授权查看这两个页面。如果您试图阻止 URL 操纵攻击,有更好的方法通过使用授权(角色)来做到这一点,但这可能需要从根本上重新设计您的架构。
-
@howcheng 感谢您的快速回复。你是对的。我已经在使用授权,因此我不需要总是隐藏参数。如果我想将对象作为参数传递,我只会隐藏它们!非常感谢。
标签: c# asp.net .net asp.net-mvc query-string