我是一名从事C#MVC应用程序的相对较新的开发人员,根据他们应该能够看到的字段为不同的人提供不同的视图。也就是说,用户1可能会看到(并且能够输入数据)字段A,B和C,而用户2可能只能看到字段A.
我现在的计划是将表单发回给我的控制器中的单个动作,但我试图弄清楚我是否需要防止用户1修改表单的可能性得到它,在浏览器中添加字段B和C,然后将其发送回服务器,以便在数据库中设置他不应该访问的值。
我告诉该地区的其他人AntiForgeryToken应该防止这种类型的攻击,但我的研究暗示它只能防止跨站点伪造攻击,我不认为这属于那一类。我的问题是:AntiForgeryToken是否可以防止这种情况发生?或者我是否需要继续保持“不信任用户发送给您的内容”的想法。并明确忽略那些用户无权使用的字段?
答案 0 :(得分:2)
你是完全正确的,这是一个问题。所有防伪令牌都是为了确保您的应用程序生成表单,而不是手工制作。但是,这并不意味着事后不会被篡改。
例如,假设您有两个用户,他们都拥有您的应用帐户:GoodUser
和NaughtyUser
。他们都使用您的应用程序来请求特定表单,允许他们在网站上执行某些操作(例如编辑拍卖)。它们之间的区别在于GoodUser
仅对编辑拍卖感兴趣,但是,由于2个用户彼此直接竞争,NaughtyUser
想要破坏GoodUser
的拍卖。
为此,NaughyUser
决定打开一个表单来编辑他自己的一个拍卖。此时,他已在表格中收到有效的防伪标记。所以现在NaughtyUser
修改了表单上的数据,其目的是有意编辑GoodUser
的拍卖,并将其POST到服务器。防伪令牌本身绝对会不防止这种情况,因为令牌本身是通过合法来源生成的。
这是一种不同类型的攻击,你肯定应该在服务器端保护它。
答案 1 :(得分:1)
这很简单。为了保护我们的服务器免受非法请求,我们允许提交仅由我们的服务器制作的表单。这意味着,一旦ASP.NET服务器执行操作方法并为客户端准备HTML,它将使用加密令牌 签名您的表单。当表单提交时,此服务器生成的令牌将与表单的数据一起发送,如果您使用 validateantiforgerytoken 属性标记您的操作,则服务器将检查表单以获取此唯一令牌。如果它存在且在此服务器上生成令牌,则将通过验证。