1

我正在开发一个同时使用 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 值并使用敲除从服务器加载数据。这也很有效,但是,在 chrome、firebug 或任何数量的开发工具中更改 data-songid 值并不难。更改该值后,用户可以单击链接并编辑其他实体...:S

我有更好的方法吗?我非常担心这是我的应用程序中的一个巨大的安全漏洞。

提前致谢!

4

2 回答 2

3

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

正如您所说,这不会阻止用户更改 ID,但会阻止他们修改不允许修改的数据。通常我认为这已经足够了,因为您的用户只能修改他们自己的数据,而这些数据可能他们无论如何都可以编辑?

如果您确实需要确保用户没有更改值,那么您可以在将其输出到 Razor 页面之前对 ID 进行加盐并生成服务器端摘要。然后可以使用它来验证在 Ajax 请求中发回该值时是否未修改该值。这篇文章给出了一个使用这种技术来防篡改 URL 查询字符串的示例,但可以很容易地适应像你这样的场景:http: //www.pradyblog.com/index.php/2012/08/20/creating-tamper-证明 url-in-asp-net-a-way-to-prevent-spoofing-and-forged-http-requests/

于 2013-03-02T12:44:37.130 回答
1

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

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

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

于 2013-03-02T02:36:38.627 回答