2012-01-06 1 views
1

내 문제는 사람들이 가정용/DeleteSong? id = 139와 같은 URL을 입력하면 가정용 컨트롤러에서 내 작업을하고 노래와 물건을 삭제할 수 있다는 것입니다. 나는 [authorize] 속성을 사용할 수 있다고 믿지만 로그인 한 사용자는 아직 내 행동을 사용하기 위해 url을 입력 할 수 없다. 나는 주로 서버와 통신하기 위해 아약스 요청을 사용하므로 아약스 요청에 대한 내 조치를 확인해야한다. 그렇지 않으면 다른 일을해야한다. 사용자가 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와 아약스 기능을 삭제합니다

$("#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

제어기 및 조치 메소드에서 권한 부여 태그를 사용할 때 역할을 지정할 수도 있습니다. EG : 관리자 컨트롤러 또는 행동

[Authorize(Roles="Admin")] 

그 시나리오에 적용되지 않으며 그 다음 액션 메소드의 체크 제일 먼저 추가 지정 논리를 필요로하는 경우하십시오. 사용자에게 권한이 없으면 사용자에게 오류 페이지를 지정해야합니다.

+0

예; 예를 들어 사용자 소유 일 경우 상태 코드 403을 반환하고 현재 사용자는 삭제를 위해 제출 된 이미지 ID를 소유하지 않습니다. –