AntiForgeryToken是否可以防止提交给服务器的额外表单字段?

时间:2015-11-20 22:13:47

标签: c# asp.net-mvc

我是一名从事C#MVC应用程序的相对较新的开发人员,根据他们应该能够看到的字段为不同的人提供不同的视图。也就是说,用户1可能会看到(并且能够输入数据)字段A,B和C,而用户2可能只能看到字段A.

我现在的计划是将表单发回给我的控制器中的单个动作,但我试图弄清楚我是否需​​要防止用户1修改表单的可能性得到它,在浏览器中添加字段B和C,然后将其发送回服务器,以便在数据库中设置他不应该访问的值。

我告诉该地区的其他人AntiForgeryToken应该防止这种类型的攻击,但我的研究暗示它只能防止跨站点伪造攻击,我不认为这属于那一类。我的问题是:AntiForgeryToken是否可以防止这种情况发生?或者我是否需要继续保持“不信任用户发送给您的内容”的想法。并明确忽略那些用户无权使用的字段?

2 个答案:

答案 0 :(得分:2)

你是完全正确的,这是一个问题。所有防伪令牌都是为了确保您的应用程序生成表单,而不是手工制作。但是,这并不意味着事后不会被篡改。

例如,假设您有两个用户,他们都拥有您的应用帐户:GoodUserNaughtyUser。他们都使用您的应用程序来请求特定表单,允许他们在网站上执行某些操作(例如编辑拍卖)。它们之间的区别在于GoodUser仅对编辑拍卖感兴趣,但是,由于2个用户彼此直接竞争,NaughtyUser想要破坏GoodUser的拍卖。

为此,NaughyUser决定打开一个表单来编辑他自己的一个拍卖。此时,他已在表格中收到有效的防伪标记。所以现在NaughtyUser修改了表单上的数据,其目的是有意编辑GoodUser的拍卖,并将其POST到服务器。防伪令牌本身绝对会防止这种情况,因为令牌本身是通过合法来源生成的。

这是一种不同类型的攻击,你肯定应该在服务器端保护它。

答案 1 :(得分:1)

这很简单。为了保护我们的服务器免受非法请求,我们允许提交仅由我们的服务器制作的表单。这意味着,一旦ASP.NET服务器执行操作方法并为客户端准备HTML,它将使用加密令牌 签名您的表单。当表单提交时,此服务器生成的令牌将与表单的数据一起发送,如果您使用 validateantiforgerytoken 属性标记您的操作,则服务器将检查表单以获取此唯一令牌。如果它存在且在此服务器上生成令牌,则将通过验证。