세부 정보 및 삭제 메서드 검사Examining the Details and Delete Methods

Rick Andersonby Rick Anderson

Note

ASP.NET MVC 5와 Visual Studio 2013를 사용 하는이 자습서의 업데이트 된 버전 을 사용할 수 있습니다.An updated version of this tutorial is available here that uses ASP.NET MVC 5 and Visual Studio 2013. 더 안전 하 고 더 간단 하 고 더 많은 기능을 보여 줍니다.It's more secure, much simpler to follow and demonstrates more features.

자습서의이 부분에서는 자동으로 생성 된 DetailsDelete 메서드를 검사 합니다.In this part of the tutorial, you'll examine the automatically generated Details and Delete methods.

세부 정보 및 삭제 메서드 검사Examining the Details and Delete Methods

Movie 컨트롤러를 열고 Details 메서드를 검사 합니다.Open the Movie controller and examine the Details method.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

이 작업 메서드를 만든 MVC 스 캐 폴딩 엔진은 메서드를 호출 하는 HTTP 요청을 보여 주는 주석을 추가 합니다.The MVC scaffolding engine that created this action method adds a comment showing a HTTP request that invokes the method. 이 경우 세 개의 URL 세그먼트 (Movies 컨트롤러, Details 메서드 및 ID 값이 포함 된 GET 요청입니다.In this case it's a GET request with three URL segments, the Movies controller, the Details method and a ID value.

Code First를 사용 하면 Find 메서드를 사용 하 여 데이터를 쉽게 검색할 수 있습니다.Code First makes it easy to search for data using the Find method. 메서드에 기본 제공 되는 중요 한 보안 기능은 코드에서 작업을 수행 하려고 시도 하기 전에 Find 메서드가 영화를 발견 했는지 확인 하는 것입니다.An important security feature built into the method is that the code verifies that the Find method has found a movie before the code tries to do anything with it. 예를 들어 해커가 http://localhost:xxxx/Movies/Details/1에서 만든 URL을 http://localhost:xxxx/Movies/Details/12345 (또는 실제 영화를 나타내지 않는 다른 값)와 같이 변경 하 여 사이트에 오류를 발생 시킬 수 있습니다.For example, a hacker could introduce errors into the site by changing the URL created by the links from http://localhost:xxxx/Movies/Details/1 to something like http://localhost:xxxx/Movies/Details/12345 (or some other value that doesn't represent an actual movie). Null 동영상을 검사 하지 않은 경우에는 null 영화에서 데이터베이스 오류가 발생 합니다.If you did not check for a null movie, a null movie would result in a database error.

DeleteDeleteConfirmed 메서드를 검토합니다.Examine the Delete and DeleteConfirmed methods.

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    Movie movie = db.Movies.Find(id);
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

HTTP Get``Delete 메서드는 지정 된 동영상을 삭제 하지 않으며 삭제를 제출 (HttpPost) 할 수 있는 동영상 뷰를 반환 합니다.Note that the HTTP Get``Delete method doesn't delete the specified movie, it returns a view of the movie where you can submit (HttpPost) the deletion.. GET 요청에 대한 응답에서 삭제 작업을 수행하는 것은(또는 해당 문제에 대한 편집 작업, 만들기 작업 또는 데이터를 변경하는 기타 작업을 수행하는 것은) 보안 허점을 야기합니다.Performing a delete operation in response to a GET request (or for that matter, performing an edit operation, create operation, or any other operation that changes data) opens up a security hole. 이에 대 한 자세한 내용은 Stephen Walther의 블로그 항목 ASP.NET MVC 팁 #46를 참조 하세요. 보안 허점을 만들기 때문에 Delete 링크를 사용 하지 마세요.For more information about this, see Stephen Walther's blog entry ASP.NET MVC Tip #46 — Don't use Delete Links because they create Security Holes.

데이터를 삭제하는 HttpPost 메서드의 이름은 HTTP POST 메서드에 고유한 서명 또는 이름을 부여하기 위해 DeleteConfirmed로 지정됩니다.The HttpPost method that deletes the data is named DeleteConfirmed to give the HTTP POST method a unique signature or name. 두 메서드의 서명은 다음과 같습니다.The two method signatures are shown below:

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)

CLR(공용 언어 런타임)은 고유한 매개 변수 서명을 갖기 위해 오버로드된 메서드가 필요합니다(동일한 메서드 이름이지만 다른 매개 변수의 목록).The common language runtime (CLR) requires overloaded methods to have a unique parameter signature (same method name but different list of parameters). 그러나 여기에서 두 개의 Delete 메서드 (GET의 경우 하나, POST의 경우 one)는 동일한 매개 변수 시그니처를 갖고 있어야 합니다.However, here you need two Delete methods -- one for GET and one for POST -- that both have the same parameter signature. (모두 매개 변수로 단일 정수를 허용해야 합니다.)(They both need to accept a single integer as a parameter.)

이를 정렬 하기 위해 몇 가지 작업을 수행할 수 있습니다.To sort this out, you can do a couple of things. 하나는 메서드에 다른 이름을 지정 하는 것입니다.One is to give the methods different names. 앞의 예에서 스캐폴딩 메커니즘이 수행한 것입니다.That's what the scaffolding mechanism did in the preceding example. 그러나 이는 작은 문제를 가져옵니다. ASP.NET은 URL의 세그먼트를 이름으로 작업 메서드에 매핑하고 메서드의 이름을 바꾸면 정상적으로 라우팅하여 해당 메서드를 찾을 수 없게 됩니다.However, this introduces a small problem: ASP.NET maps segments of a URL to action methods by name, and if you rename a method, routing normally wouldn't be able to find that method. 솔루션은 예제에서 확인한 것으로, ActionName("Delete") 특성을 DeleteConfirmed 메서드에 추가하는 것입니다.The solution is what you see in the example, which is to add the ActionName("Delete") attribute to the DeleteConfirmed method. 이렇게 하면 POST 요청에 대 한 /Delete/를 포함 하는 URL이 DeleteConfirmed 메서드를 찾을 수 있도록 라우팅 시스템에 대 한 매핑이 효과적으로 수행 됩니다.This effectively performs mapping for the routing system so that a URL that includes /Delete/for a POST request will find the DeleteConfirmed method.

동일한 이름 및 서명을 가진 메서드의 문제를 방지 하는 또 다른 일반적인 방법은 사용 하지 않는 매개 변수를 포함 하도록 POST 메서드의 서명을 인위적으로 변경 하는 것입니다.Another common way to avoid a problem with methods that have identical names and signatures is to artificially change the signature of the POST method to include an unused parameter. 예를 들어, 일부 개발자는 POST 메서드로 전달 되는 FormCollection 매개 변수 형식을 추가한 다음 매개 변수를 사용 하지 않습니다.For example, some developers add a parameter type FormCollection that is passed to the POST method, and then simply don't use the parameter:

public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

요약Summary

이제 로컬 DB 데이터베이스에 데이터를 저장 하는 완전 한 ASP.NET MVC 응용 프로그램이 있습니다.You now have a complete ASP.NET MVC application that stores data in a local DB database. 영화를 만들고, 읽고, 업데이트 하 고, 삭제 하 고, 검색할 수 있습니다.You can create, read, update, delete, and search for movies.

다음 단계Next Steps

웹 응용 프로그램을 빌드 및 테스트 한 후에는 다른 사용자가 인터넷을 통해 사용할 수 있도록 다음 단계를 수행 합니다.After you have built and tested a web application, the next step is to make it available to other people to use over the Internet. 이렇게 하려면 웹 호스팅 공급자에 배포 해야 합니다.To do that, you have to deploy it to a web hosting provider. Microsoft는 무료 Windows Azure 평가판 계정에 최대 10 개의 웹 사이트를 위한 무료 웹 호스팅을 제공 합니다.Microsoft offers free web hosting for up to 10 web sites in a free Windows Azure trial account. 다음에 나오는 자습서에 따라 멤버 자격, OAuth 및 SQL Database를 사용 하 여 Windows Azure 웹 사이트에 보안 ASP.NET MVC 앱을 배포 하는 것이좋습니다.I suggest you next follow my tutorial Deploy a Secure ASP.NET MVC app with Membership, OAuth, and SQL Database to a Windows Azure Web Site. 뛰어난 자습서는 ASP.NET MVC 응용 프로그램에 대 한 Entity Framework 데이터 모델을 만드는Tom Dykstra의 중간 수준입니다.An excellent tutorial is Tom Dykstra's intermediate-level Creating an Entity Framework Data Model for an ASP.NET MVC Application. StackoverflowASP.NET MVC 포럼 은 질문을 할 수 있는 좋은 장소입니다.Stackoverflow and the ASP.NET MVC forums are a great places to ask questions. twitter에서 를 팔로우하시면 최신 자습서 업데이트를 받으실 수 있습니다.Follow me on twitter so you can get updates on my latest tutorials.

사용자 의견을 환영 합니다.Feedback is welcome.

- Rick Anderson twitter: @RickAndMSFTRick Anderson twitter: @RickAndMSFT
- Scott Hanselman twitter: @shanselmanScott Hanselman twitter: @shanselman