2013-03-02 52 views
1

我正在使用MVC和KnockoutJS的项目,我想知道如何最好地为网站提供安全性。使用模型绑定敲除JS/MVC安全

这是我的问题。

我允许使用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 
    }; 
}(); 

在我的点击处理我然后实例化所需的视图模式,一切都很好,这个伟大的工程!

是我遇到的问题是,我有事情在我的剃刀语法如下:

<li><a href="#" data-songid="@Model.Song.Id" class="icon-margin-left manage-song">Edit Song</a></li> 

在我的点击处理我读出的数据,songid值,并利用基因敲除从服务器加载数据。这也很好,但是,改变chrome,firebug或任何开发工具中的data-songid值并不是很难。一旦该值发生变化,用户就可以点击链接并编辑另一个实体...:S

有没有更好的方法可以做到这一点?我非常担心在我的应用程序中这是一个巨大的安全漏洞。

在此先感谢!

回答

1

更好的方法是检查服务器端的权限。

你说的很对,很容易在浏览器开发工具中调整JS变量。伪造整个HTTP请求也很容易发送到服务器。

该规则是永远不会相信用户的输入,并始终验证此特定用户在处理后端请求时是否有权编辑此特定歌曲。

+0

是的,我有安全构建在服务器端,但我不喜欢这是一切皆有可能。我想我必须忍受这样一个事实,即如果用户想要篡改他们自己的数据,那么这个用户就可以。 – mcottingham 2013-03-02 02:56:42

3

假设您已经在您的网站上应用了Asp.Net身份验证,那么来自Knockout的Ajax请求应该包含Asp.Net身份验证Cookie(除非请求是跨域),以便在返回之前应用服务器端身份验证/授权数据。正如Alex指出的那样,这是必不可少的,也是确保用户只能修改自己的数据的唯一方法。

正如你所说,虽然这并不阻止用户更改ID,但它确实阻止他们修改他们不允许修改的数据。通常我认为这已经足够了,因为用户只能修改他们自己的数据,而这些数据大概是可以编辑的呢?

如果您确实需要确保用户没有更改该值,那么您可以在ID页面中生成一个服务器端摘要,然后在Razor页面中输出它。这可以用来验证该值在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/