MVC2路由和安全:如何安全地传递参数?

时间:2011-01-07 15:19:23

标签: asp.net-mvc-2 query-string asp.net-mvc-routing

我是来自WebForms的相对MVC菜鸟。我认为我对MVC有很好的把握,除了几个例外,我想我可能已经打破了这种模式。我会尽量保持这个简短,所以我假设我要求的大部分内容都相对明显。

假设我有一个包含文章的新闻网站。在这种情况下,mynewssite.com/Articles/123形式的URL工作得很好,因为我不关心谁查看哪篇文章。用户可以将URL中的ArticleID更改为他们想要的任何内容并提取该文章。但是,在我的情况下,我只希望用户能够查看/编辑属于它们的数据实体(文章或其他)。为此,我使用他们的UserID(GUID)作为数据库中的外键,并显示他们的数据列表供他们选择。问题就出现了......当他们点击Url.Action创建的链接时(“编辑”,新建{.id = item.id})(我没有使用ActionLink,因为我需要添加HTML内容在链接内),id显示为查询字符串参数。我可以为它添加一个路由,但是ID仍然会显示在URL中以供他们篡改。显而易见的是,通过篡改URL,他们可以查看/编辑他们想要的任何实体。

我错过了什么? 有没有一种很好的方法来传递参数而不在URL上添加它们?我知道我可以将它们放在页面上的表单中并提交表单,但这对我的示例来说似乎很麻烦,而且我在与这个想法相冲突的地方使用jQuery.ajax。 我也可以根据Edit方法中的数据检查他们的UserID,但这看起来也很麻烦。

这个问题太宽泛了吗?请告诉我你需要什么细节。感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用forms authentication。这样,当用户验证加密的cookie时,将发出包含其用户名的加密cookie,该用户名不能被篡改。然后,您可以验证当前连接的用户是否具有编辑此文章的授权。

答案 1 :(得分:0)

即使在Winforms中,您也必须在每个请求上添加特殊逻辑,以仅过滤用户拥有的文章。我不明白为什么MVC会有所不同。当然,您可以使用web.config拒绝访问给定的URL,但是当您使用单个页面来获取要显示的数据的参数时,则不能。

您最好的选择可能是在数据库级别对此进行过滤。通过添加包含用户ID的where子句,应用程序将返回“找不到记录”的错误类型,您可以随意执行任何操作。