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 を変更することを妨げませんが、変更を許可されていないデータを変更することを防ぎます。多くの場合、ユーザーは自分のデータしか変更できないため、これで十分だと思いますが、おそらくとにかく編集できますか?

ユーザーが値を変更していないことを本当に確認する必要がある場合は、ID をソルトし、Razor ページに出力する前にサーバー側のダイジェストを生成できます。これを使用して、値が 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 に答える