2012-01-06 3 views
1

私の問題は、人々がhome/DeleteSong?id = 139のようなものをURLに入力すると、彼らは家のコントローラーで自分の行動に到達していて、曲やものを削除できることです。私は[authorize]属性を使うことができると信じていますが、ログインしていないユーザは、私の行動を使用するためにURLを入力することはできません。私は主にサーバーと通信するためにAjaxリクエストを使用するので、Ajaxリクエストのために自分のアクションをチェックする必要があります。ユーザーが任意のURLを入力するとホームページにリダイレクトされるようにプロジェクトを設定したいのですが、どうすればこの問題は解決しますか?どのようにURLのクエリからasp.net mvc 3サイトを保護するには?

自分の行動:

[HttpPost] 
    public ActionResult DeleteTopTenFav(int id) 
    { 
     var song = repository.GetTopTenFav(id); 

     var points = repository.FindPoints(song.UserName); 
     foreach (var item in points) 
     { 
      item.TopTenFav = null; 
     } 

     repository.DeleteTopTenFav(song); 
     repository.Save(); 
     return RedirectToAction("Index"); 
    } 

私のjqueryのAJAX機能を削除します。

$("#topTenContainer").on("click", ".btnDeleteTopTenFavSong", function() { 
    var button = $(this); 
    var songId = $(this).attr('name'); 

    $.ajax({ 
     beforeSend: function() { ShowAjaxLoader(); }, 
     type: 'POST', 
     url: "/Home/DeleteTopTenFav/", 
     data: { id: songId }, 
     success: function() { HideAjaxLoader(), ChangeColorShowMsg("green"), ShowSuccessMsgAndReplaceTopTenSong("Song deleted successfully", button) }, 
     error: function() { HideAjaxLoader(), ChangeColorShowMsg("red"), ShowMsg("Song could not be deleted, please try again") } 
    }); 
}); 
+0

いいえ、あなたの問題は解決しません。 – dotjoe

答えて

5

はあなたのコントローラは、ログオンしているユーザーが指定されたアイテムに要求されたアクションを取るためのアクセス許可を持っていることを検証しなければなりませんおそらく「所有者」フィールドまたは何らかの関連する項目をチェックすることによって可能になる。これは、ユーザーがサイトリクエストフォージェリ攻撃を横切るように公開するよう

[HttpPost] 
[Authhorize] 
public ActionResult Delete(int id) 
{ 
    var image = repo.GetImage(id); 
    if(image.UploadedByUser.id == User.Identity.Name) 
    { 
     // .... do the delete 
    } 
    else 
    { 
     //...don't do it 
    } 
} 

また、あなたは、GETリクエストに基づいてアクションを取るべきではありません。すべての「破壊的」または「創造的」アクションには常にPOSTを使用し、偽造防止トークンの使用を検討する必要があります。

+0

はい私はすべてのそのような行為の投稿を持っています:) –

+1

いいえ、人々はURLを入力して何かを削除することはできません。 –

+0

彼はおそらく、曲のリストを持つインデックスページを持っています。行の削除リンクをクリックすると、クエリ文字列のidが渡され、httpポストで削除を行う確認ページにリダイレクトされます。 –

1

通常のベストプラクティスは、削除のような操作を実行する場合にPOSTリクエストを使用することです。あなたがウェブの性質について考えるなら、何かを削除するためにGETを発行するのは奇妙なことです。投稿付きの削除を行い、属性を使用してメソッドを飾り付けることを確認してください。[HttpPost]

+0

私はhttpPost attrを持っていますが、ユーザはアクションの名前とURLの曲のパラメータIDを渡します –

+0

httpPostを持っている場合、ブラウザにurlを入力してアクションにアクセスすることは不可能です。 – KMan

+0

@Alan KManはここで正しいです:あなたがあなたの質問に述べていることが本当に起こっているなら、あなたはHttpPostで装飾された適切なメソッドを持っていません。 –

0

POSTを要求し、CSRF保護を使用する必要があります。

これを行うには、[HttpPost]属性と[ValidateAntiForgery]属性を使用します。

1

コントローラとアクションメソッドでauthorizeタグを使用する場合は、ロールを指定することもできます。 EG:管理コントローラやアクション

[Authorize(Roles="Admin")] 

のためにそれはあなたのシナリオでは適用されない、それは、あなたのアクションメソッドにチェック最初のものを追加し、カスタム・ロジックを必要とする場合。彼らは許可を持っていない場合、それをユーザーに指定するエラーページにリダイレクトする必要があります。

+0

Yup;たとえば、それがユーザの所有物であり、現在のユーザが削除のために提出されたイメージIDを所有していない場合、ステータスコード403を返します。 –

関連する問題