带模型绑定的Knockout JS / MVC安全性

时间:2013-03-02 01:13:39

标签: asp.net-mvc security razor knockout.js

我正在开发一个同时使用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

我有更好的方法吗?我非常担心这在我的申请中是一个巨大的安全漏洞。

提前致谢!

2 个答案:

答案 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请求也很容易。

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