1

무단 액세스로부터 웹 사이트를 보호하는 방법을 배우고 있으며 위조 방지 도구를 발견했습니다. 여기에 내 생각이있다. (그리고 내 문제도있다.) 내가 틀렸다면 나를 바로 잡아주세요.위조 방지 - 작동 방식을 더 잘 이해하십시오.

위조 방지는 ASP.NET MVC 응용 프로그램에서 처리됩니다 (다른 많은 방법이있을 수 있지만이 방법은 매우 일반적입니다). @Html.AntiForgeryToken()을 웹 페이지에있는 Form에 삽입하여 삽입하십시오.

이 토큰

나중에 사용자가 우리가 [ValidateAntiForgeryToken] 속성과 우리의 IActionResult 또는 JsonResult 방법을 장식하는 경우 시스템에 데이터를 POST하려고하면 사용, 그것은 키가 예상 결과와 일치하는지 여부를 확인합니다. 우리는 우리의 사업에 대한 무단 액세스 데이터베이스와 같은 개체를 허용하지 않으 있도록 높은 웹 사이트는, 키는 위조 방지를 사용하는 이유

[Route("")] 
    [HttpPost("")] 
    [ValidateAntiForgeryToken] 
    public JsonResult UpdateRecords([FromBody]CustomRequest request) 
    { 
     if (ModelState.IsValid) 
     { 
      //...do some logic here 
     } 
    } 

그 이유는 여기에 내가 장식으로 무엇을 의미하는지의 예입니다. 문제는 웹 사이트가 쿠키 인증을 사용하여 로컬 캐시에 저장되는 경우 해커가이 저장된 값을 쉽게 검색하여 웹 사이트에 데이터를 게시 할 때 사용할 수 있다는 것입니다. 그 때문에 데이터 게시시 확인중인 웹 페이지에 특수 (고유 한) 키를 삽입하여 다른 보호 수준을 구현합니다. 키가 일치하지 않으면 전체 게시 절차가 실패합니다.

여기 제가 이해가 안되는 부분이 있습니다. 이제 우리는이 같은 우리의 웹 페이지에 매우 간단한 양식에 우리의 안티 위조를 구현한다고 가정 해 봅시다 : 나는 아무것도하지 않습니다 알고

<form method="post" ng-submit="addItem()" id="main-form"> 
     @Html.AntiForgeryToken() 
     <input placeholder="Add New Item" ng-model="newItem" id="new-item" /> 
    </form> 

만의이 input 버튼 사용자를 클릭하여 데이터베이스에 일부 데이터를 게시하려고 있다고 가정 해 봅시다 . 우리가 웹 페이지를 검사 할 경우, 우리는 갑자기이 HTML 코드는 같을 것이다 발생하는 것입니다 것을 볼 수 있습니다 : 지금 여기

<form class="ng-pristine ng-valid" method="post" ng-submit="addItem()" id="main-form"> 
     <input name="__RequestVerificationToken" value="CfDJ8Ig8dRjRrw9FjKYv6kYaxVu7APOddjpVxQ3ZxGaamjVzV03eQEG7tgRe5q2uXJkKkbUf4RqzRCtJ1DGMK5C-ymroTBe_J9XQ-...(more text here)" type="hidden"> 
     <input class="ng-pristine ng-valid ng-touched" placeholder="Add New Item" ng-model="newItem" id="new-item"> 
    </form> 

, I (및 잠재적 인 해커)가 볼 수있는, 특별한 위조 방지 키는 우리는 방금 이야기했습니다. 이 키는 웹 사이트를 사용하는 모든 사람들에게 어떻게 표시됩니까? 내가 이해할 수있는 것은 기본적으로 해커에게 코드를 제공하고 있으며 자신을 인증하기 위해 데이터베이스에 게시 할 때 쉽게 사용할 수 있다는 것입니다. 또는 나는 틀린가?

저는 현재 매우 혼란스러워서이 문제에 관한 도움/정보 또는 권장 사항을 높이 평가할 것입니다.

+0

'__RequestVerificationToken' 값을 검사하고 쿠키와 비교할 것을 권장합니다. 양식을 여러 번 게시하고 숨겨진 입력 필드 '__RequestVerificationToken'의 값이 ** 고유 **인지 확인해야합니다.즉, HTTP를 통해 데이터를 POST하고 누군가가 트래픽을 보게되면 AntiForgeryToken이 실패 할 것이기 때문에 여전히 자신의 요청을 게시 할 수 없습니다. [here] (http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks)를 참조하십시오. – Oleg

+0

'AntiForgeryToken()'은 권한 부여와 아무 관련이 없습니다. CSRF (cross-site request forgery) 공격을 막기위한 것입니다. [이 기사] (http://www.devcurry.com/2013/01/what-is-antiforgerytoken-and-why-do-i.html)와 [this one] (http://stackoverflow.com/)을 참조하십시오. 질문/38555299/anti-forgery-better-understanding-how-it-works)에 대한 이해 –

답변

0

사람들이 양식 요청을 위조하는 것을 방지하기위한 토큰이 있습니다. 또한 필요할 때마다 재생성됩니다. - 적어도 사용자 당 및 요청 당 (필자는이 마지막 지점에서 확실하지 않습니다). 즉, 공격자는 자신의 토큰을 복사하거나 만들 수 없습니다. 그들은 사용자의 페이지에서 가져와야 할 것입니다. 만약 가능하다면 어쨌든 토큰을 우회 할 충분한 정보를 가지고있을 것입니다.

공격자 은 다른 웹 사이트에서 일부 값으로 양식을 만들고 웹 사이트의 페이지를 가리킬 수 있습니다. 관리자가 (예를 들어 무의식적으로 javascript를 통해)이 양식을 제출하면 해당 권한과 공격자가 지정한 값으로 해당 작업을 효과적으로 수행 할 수 있습니다. 이는 누군가를 속여서 계정을 삭제하거나 외설스러운 것을 게시하는 등의 충분한 지식이 있으면 좋지 않습니다.