2011-03-18 2 views
0

기존 응용 프로그램에서는 삽입, 업데이트 및 삭제 작업을위한 저장 프로 시저를 만들어야한다고하는 것은 일반적인 지식입니다. 또한 트리거를 사용할 필요가 없도록 저장 프로 시저를 사용하므로 트리거의 일반적인 함정을 피할 수 있습니다.저장 프로 시저 대신 보안을위한 뷰 및 트리거 사용

또 다른 생각은 전체 데이터베이스를 뷰로 덮는 것입니다. 누구도 테이블 자체에 액세스 할 수 없으므로 뷰에 대해 CRUD 작업을 수행합니다. 그렇게하면 특정 열에 대한 액세스 권한을 다른 사용자에게 부여하려는 경우 해당 열이 포함 된보기 또는 계산 만 만들 수 있습니다. 업데이트 & 삭제 작업에 논리를 적용해야하는 경우 (즉, 누군가가 테이블의 총 행 수에 2 % 이상 영향을주지 못하게하는 경우) instead of 트리거를 통해이를 수행 할 수 있습니다.

트리거의 일반적인 함정에 빠지지 않기 위해 (1) 트리거는 테이블 만 업데이트해야하며 다른 뷰는 업데이트하지 않아야합니다. (2) 트리거는 절대로 테이블에 놓이지 않습니다. (3)보기는 다른보기에 액세스 할 수 없습니다. (4) 어떤 이유로 든 처음 세 가지 규칙에 따라 원하는 것을 수행 할 수없는 경우 저장 프로 시저를 만듭니다.

보안을 구현할 때 나타나는 이점은보기 및 어쩌면 일부 트리거 (평균 사례 - 2 개의 추가 개체) 만 만들어야한다는 것입니다. 반면 저장 프로 시저 경로를 만들면 항상 3 개 이상 또는 4 개의 추가 오브젝트 (선택을위한 프로 시저를 작성한 경우에 따라 다름). 또한 모든 객체에 대해 세 개의 프로 시저를 매핑 할 필요가 없으므로 NHibernate 매핑이 더 간단합니다.

저장 프로 시저보다는 뷰와 트리거를 주로 사용하는 것과 관련하여 심각한 보안 허점이나 실제적인 문제가있는 경우 질문이 있습니다.

+1

은 "Conventional wisdom"에 대한 참고 자료를보고 싶습니다. 응용 프로그램의 향후 변경 사항에 대해 매우 복잡하고 확실한 악몽을 통해 읽습니다. 이것은 응용 프로그램 보안을 처리하기위한 실용적인 해결책이 아닙니다. –

+0

@K - 무엇이 복잡하게 들릴까요? "Conventional wisdom"또는 "triggers & views"? – kelloti

답변

1

Ther는 본질적으로 트리거와 뷰를 사용하는 것으로 잘못된 것은 아닙니다. 다른 코드와 마찬가지로 제대로 작성되어야하며 종종 빈약 한 개발자가 나쁜 코드를 작성하여 빈약 한 평판을 얻습니다. 예를 들어 성능이 저하 될 수 있으므로 뷰가 다른 뷰를 호출하는 것을 원하지 않습니다. 업데이트/삭제/삽입에서 한 행만 영향을받는 것으로 가정하는 트리거는 원하지 않습니다.

+0

답변 해 주셔서 감사합니다. 네 번째 규칙을 추가했는데보기가 다른보기에 액세스 할 수 없습니다. 그러나, 나는 보통 이것을 "좋은 습관"아래에 제출할 것입니다. 이 질문을하는 이유는 동료가 저장 프로 시저를 거의 사용하지 않기로 결정했기 때문입니다. – kelloti

+0

저장된 procs를 사용하는 것은 본질적으로 잘못이 아닙니다. 우리는이 세 응용 프로그램 모두에서 사용합니다. 성능, 데이터 무결성 및 보안을 위해 데이터 액세스를 설계하기 만하면됩니다. 최종 목적지까지는 여러 경로가 있습니다. – HLGEM

1

저는 개인적으로 데이터베이스에 대한 응용 프로그램 액세스를 위해 저장 프로 시저를 사용하는 경향이 있습니다. 필자는 일반적으로 각 테이블에 대한 작업을 관리하고 데이터 무결성을 보장하는 일반적인 프로 시저 집합을 사용합니다. 주어진 정보를 보거나 편집 할 수있는 사람에 관한 모든 결정은 응용 프로그램 자체에서 처리됩니다. 앱 자격증 명만 데이터베이스에 대한 액세스 권한을 가지므로 액세스 권한이있는 모든 사용자는 잠겨 있거나 읽기 전용 액세스 권한이 있습니다.

뭔가를 디버깅하려고 할 때 놓치기 쉽기 때문에 비즈니스 로직을 구현하는 트리거를 싫어하는 경향이 있습니다. 모든 인서트 논리가 SP에 래핑 된 경우 해당 SP를 당겨서 인서트가 실패한 이유를 진단 할 수 있습니다. 잊어 버렸거나 알지 못했던 테이블에 방아쇠가있는 경우, 깨닫기 전에 잠시 기다려야합니다. (이것은 내 환경의 요소 일 가능성이 높지만 더 많은 트리거가 여기 사용 된 경우 내 사고 프로세스에서 더 두드러 질 것이라고 확신 함)

그러나 나는 우리가 동일한 관점에서 이것을보고 있는지 확실하지 않습니다. . 각 사용자 집합마다 서로 다른보기를 만드는 경우 데이터 저장소에 직접 액세스하고 응용 프로그램 인터페이스를 통해 작업하지 않는 것처럼 들릴까요? 이 구조에 대한 응용 프로그램 인터페이스가있는 경우 올바른보기를 사용하기 위해 각 사용자 그룹에 대해 업데이트하고 다시 컴파일 할 필요가 없습니까?

저장 프로 시저는 응용 프로그램 인터페이스 또는 미리 작성된 보고서를 지원하는 데 적합하지만 사용자가 응용 프로그램 인터페이스없이 일반 데이터 저장소에 대한 읽기/쓰기 액세스 권한을 갖는 경우 더 좋은 옵션이 될 수 있습니다. 중간에.

또한 귀하의 상점에 대한 표준이 무엇인지 고려해야합니다. 다른 모든 사람들이 저장된 procs를 독점적으로 사용하고 또 다른 접근법을 취하면 나중에 돌아와서 솔루션을 유지하려고하는 모든 사람은 힘든 시간을 보게 될 것입니다.

결국 고통을주지 않으면 서 일을 완수하고 다른 문제를 일으키는 경우 좋은 해결책이었습니다.

+0

@Rozwel, 응답에 감사드립니다. 이 데이터베이스는 데이터가 민감하기 때문에 웹 응용 프로그램에서 액세스하고 있으므로 모든 적절한 예방 조치를 취해야하므로 응용 프로그램 수준이 아닌 데이터 수준에서 보안을 구현하게됩니다. 그러나 왜 각 응용 프로그램을 다시 컴파일해야하는지 생각하지 않습니다. 연결 문자열은 구성 설정입니다. – kelloti

+0

@kelloti 필자는 테이블/뷰를 지정한 연결 문자열을 작성한 적이 없으며, 테이블/뷰를 포함하는 데이터베이스 만 작성했습니다. 테이블/뷰의 이름은 sql 명령의 일부로 항상 지정되어 있습니다. 시나리오의 내용을 올바르게 이해했다면 각 클라이언트마다 변경해야합니다. SQL 명령의 내용을 다시 컴파일하지 않고도 편집 할 수있는 방법으로 저장할 수 있다고 가정합니다. 그러나 기본적으로 해당 시점에 저장된 proc 파일로 돌아가는 것처럼 보입니다. 실제로는 DB에 실제로 저장되지 않습니다. – Rozwel

+0

@kelloti 그렇지 않으면 당신은 단지 연결 문자열을 변경하면 필요한 것을 성취 할 수있는 일반적인 데이터 저장소를 가리키는보기가 포함 된 일련의 마스킹 데이터베이스를 만들 수 있다고 생각하지만, 이 구조는 큰 고통이었습니다. – Rozwel