문제

에서 나의 일반적인 응용 프로그램,사용자가 버튼을 클릭에서는 aspx 페이지를 호출합 C#업체,다음을 실행 저장된 절차입니다.

해야 하는 역할을 검사를 수행에서 최고의 스택,아래의 스택에서나 모든 수준?그것은 보인다면 악의가 있는 사용자를 호출할 수 있는 방법 중 하나,그는 호출,그래서에 대한 효과적 보안,당신은 확인 모든 메서드에서(그리고 그의 많은 추가 코드를 작성).

여기에는 전형적인 호출 스택을 설명하는 나의 질문:

Page_Load()
{
  if(p.IsInRole("Managers"))  //or equivalent attribute
  {
    AddAccount.Visible =true;
  }
}

AddAccount_OnClick()
{
  if(p.IsInRole("Managers"))  //or equivalent attribute
  {
    //Add the account
    Account.Add(...);  //and maybe another role check...
  }
}

-- TSQL doesn't understand .NET authorization, this call is in a 'trusted' subsystem
create proc Add_Account @user, @account_name
If @user in (Select user from role_table where role='manager')
-- Add the account
도움이 되었습니까?

해결책

제 생각에는 가능한 한 데이터에 가깝게 넣어야합니다. 데이터에 가까워 질수록 코드 기반을 통해 회로 경로를 사용하여 액세스 점검을 우회 할 수 없도록 할 수 있습니다.

이 인수는 데이터 소스 자체 (좋아하는 RDBMS와 같은) 또는 데이터 액세스 계층을 지원하는 경우 보안 검사가 데이터 소스 자체에 배치 될 것을 요구합니다.

그러나 일부 보안 제약은 비즈니스 논리의 강한 냄새가납니다. 예 : "사용자 가이 역할을 수행하고 이러한 사양을 충족하는 데이터를 수정하려는 경우 작업은 허용되어야합니다. 그렇지 않으면" 그것은 나에게 정책처럼 들리며, 별도의 규칙 엔진의 비즈니스 로직 계층에 속하는 것.

나는 얼마 전에 WCF의 맥락에서 비슷한 것에 대해 썼다..

다른 팁

에서 구현한 관점 그것은 최고의 솔루션을 구현하는 검사까지 스택을 같이 있기 때문에 가능한 가장 낮은 숫자의 기능이 필요한 보호,그러므로 가장 낮은 수의 것을 혼란,그리고 모든 사용자 입력을 통과해야 보호 레이어입니다.하는 경우 재단은 보호할 필요가 없 케어에 대한 모든 것을 구축하는 기초입니다.

이 솔루션은 하나의 obviouse 단점-사용자 인터페이스에 대해 아무것도 알고의 인증,승인,데이터 검증,그리고 다른 모든 물건입니다.그래서 모든 입력이 내려가 스택,오류가 발생할 수 있습,그리고 스택이 다시 사용자에게 정보를 제공하기 위해서.이 발생합니다 불쾌한 사용자 경험하기 때문에 오류가 될 수 있는 쉽게 발견되는 사용자 인터페이스에서 감지만 통과 한 후 데이터를 백엔드 시스템입니다.에 결과를 추가합니다 많은 검사를 인터페이,너무를 제공하기 위해,더 나은 사용자 경험을 제공합니다.

를 사용하면 인터페이스를 기반으로 프로그래밍,이는 전혀 문제가 없기 때문에 공유할 수 있는 확인 코드 사이의 응용 프로그램 레이어입니다.할 수 있습니다 더 쉽게 추가로 인증 코드가 모든 프로그램 레이어와이어에서 깊이 있는 버그에 하나의 응용 프로그램 레이어 잡힐 수 있습니다른 레이어에 의해.의 경우 확인 코드 자체가 잘못된 것이며 그것을 공유하는 걸쳐 응용 프로그램 레이어는 버그 및 hance 는 오류 아마 probagate 를 통해 모든 응용 프로그램 레이어입니다.

실제로 잠재적으로 위험한/민감한 작업을 수행하는 비즈니스 객체에 역할 액세스 점검을 배치 할 것입니다.

페이지로드 및 버튼 클릭 이벤트에 역할 점검을 추가하면 외부 IMHO가됩니다. 또한 페이지를 보호하려면 Web.config의 선언적 위치 지시문을 사용하여 페이지를 보호하십시오. 예 : 모든 "관리자"페이지를 별도의 폴더에 넣고 전체 폴더를 선언적으로 보호하십시오.

그러나 항상 비즈니스 객체 방법에 대한 점검을 최소화해야합니다.

메소드 레벨에 넣어야합니다. 특정 방식으로 해당 방법에 도달한다고 가정 할 수 없습니다. 이 방법은 버튼 핸들러에서 호출 할 수 있거나 모든 유형의 논리의 결과로 일반 코드로 호출 할 수 있습니다. 버튼 핸들러를 호출하는 이와 같은 것을 몇 번이나 보셨습니까?

private void MyBypassingCall()
{
  if( myLogic )
  {
    AddAccount_OnClick();
  }
}

따라서 page_load에 넣는 것만으로는 충분하지 않습니다. 또한 방법을 장식해야합니다. PrincipalPermissionAttribute. 그것은 많은 코드를 줄입니다.

이것은 비즈니스 측면에서 보안 검증을하는 것이 얼마나 중요한지에 대한 일화적인 의견 일뿐입니다. 우리의 경우 요청 해킹에 대한 기대치가 낮은 것에 대해 낙관적이지 않은 것은 충분하지 않았습니다. 우리는 비즈니스 대상에 어떤 종류의 검증이 없었으며 예상치 못한 방식으로 화상을 입었습니다. 고객이 당사 사이트 사용을 자동화하기 위해 스크립트를 구축했습니다. 결국 실제로 렌더링되지 않은 스크립트의 예상 링크를 따랐습니다. 결국 부패한 데이터가되었습니다. 물론 이것은 보안 위반보다는 시스템 상태 및 데이터 무결성 문제에 더 가깝지만 실제로는 실제로 적용된다고 생각합니다.

비즈니스 대상.

그러나 시공 시간에. 각 인스턴스가 매우 구체적인 역할을 캡처하게하십시오.

편집 : 이런 식으로 더 간결합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top