我正在开发一个同时使用MVC和KnockoutJS的项目,我想知道如何最好地为网站提供安全性。
这是我的问题。
我允许使用Razor创建视图,我使用Knockout通过JQuery对话框为很多功能提供支持。我有一个主视图模型,如下所示:
my.MasterViewModel = function () {
var
CatalogsViewModel = ko.observable(null)
BulkUploadViewModel = ko.observable(null),
ExploitationTypeViewModel = ko.observable(null),
ExploitationViewModel = ko.observable(null),
InviteSongWriterViewModel = ko.observable(null),
ManageCollaboratorsViewModel = ko.observable(null),
ManageSongwriterViewModel = ko.observable(null),
ManageSongViewModel = ko.observable(null),
ProViewModel = ko.observable(null),
SongsViewModel = ko.observable(null),
TagsViewModel = ko.observable(null),
TweaksViewModel = ko.observable(null),
NotificationsViewModel = ko.observable(new my.notificationsviewmodel());
return {
CatalogsViewModel: CatalogsViewModel,
BulkUploadViewModel: BulkUploadViewModel,
ExploitationTypeViewModel: ExploitationTypeViewModel,
ExploitationViewModel: ExploitationViewModel,
InviteSongWriterViewModel: InviteSongWriterViewModel,
ManageCollaboratorsViewModel: ManageCollaboratorsViewModel,
ManageSongwriterViewModel: ManageSongwriterViewModel,
ManageSongViewModel: ManageSongViewModel,
ProViewModel: ProViewModel,
SongsViewModel: SongsViewModel,
TagsViewModel: TagsViewModel,
TweaksViewModel: TweaksViewModel,
NotificationsViewModel: NotificationsViewModel
};
}();
在我的点击处理程序中,我然后实例化了所需的视图模型,一切都很好,这很棒!
我遇到的问题是我的Razor语法中包含以下内容:
<li><a href="#" data-songid="@Model.Song.Id" class="icon-margin-left manage-song">Edit Song</a></li>
在我的点击处理程序中,我读取了data-songid值,并使用knockout从服务器加载数据。这也很有用,但是,改变chrome,firebug或任何数量的开发工具中的data-songid值并不是很难。一旦该值发生变化,用户就可以点击该链接并编辑另一个实体......:S
我有更好的方法吗?我非常担心这在我的申请中是一个巨大的安全漏洞。
提前致谢!
答案 0 :(得分:3)
假设您在网站上应用了Asp.Net身份验证,那么来自Knockout的Ajax请求应包含Asp.Net身份验证cookie(除非请求是跨域),因此您可以在返回数据之前应用服务器端身份验证/授权。正如Alex指出的那样,这是必不可少的,也是确保用户只能修改自己数据的唯一方法。
正如您所说,这并不妨碍用户更改ID,但它确实阻止他们修改不允许修改的数据。通常我认为这已经足够了,因为您的用户只能修改自己的数据,而这些数据可能无论如何都可以编辑?
如果您确实需要确保用户未更改该值,则可以在Raz页面中输出之前将ID加密并生成服务器端摘要。然后,可以使用它来验证在Ajax请求中发回的值是否未被修改。这篇文章给出了一个使用这种技术来防篡改URL查询字符串的示例,但可以很容易地适应像您这样的场景:http://www.pradyblog.com/index.php/2012/08/20/creating-tamper-proof-url-in-asp-net-a-way-to-prevent-spoofing-and-forged-http-requests/
答案 1 :(得分:1)
更好的方法是检查服务器端的权限。
你是对的,在浏览器开发工具中调整JS变量很容易。伪造发送到服务器的整个HTTP请求也很容易。
规则是永远不要信任用户的输入,并始终验证此特定用户是否有权在后端处理请求时编辑此特定歌曲。