데이터베이스 ID 노출-보안 위험?


134

URL 등의 데이터베이스 ID를 노출하는 것이 보안 위험이라고 들었지만 그 이유를 이해하는 데 어려움을 겪고 있습니다.

왜 위험하거나 왜 그렇지 않은지에 대한 의견이나 링크가 있습니까?

편집 : 물론 액세스 범위가 지정됩니다. 예를 들어 리소스 foo?id=123를 볼 수 없으면 오류 페이지가 표시됩니다. 그렇지 않으면 URL 자체가 비밀이어야합니다.

편집 : URL이 비밀 인 경우 수명이 제한되어 생성 된 토큰 (예 : 1 시간 동안 유효하며 한 번만 사용할 수 있음)이 포함됩니다.

편집 (몇 달 후) : 현재 선호되는 방법은 ID에 UUIDS를 사용하여 노출시키는 것입니다. 일련 번호 (일반적으로 일부 DB의 성능을 위해)를 ID로 사용하는 경우 각 항목에 대해 UUID 토큰을 대체 키로 생성하고 공개하는 것이 좋습니다.

답변:


109

적절한 조건이 주어지면 식별자를 노출하는 것이 보안 위험이 아닙니다. 그리고 실제로는 식별자를 노출시키지 않고 웹 응용 프로그램을 설계하는 것은 매우 부담이됩니다.

준수해야 할 몇 가지 규칙은 다음과 같습니다.

  1. 역할 기반 보안을 사용하여 작업에 대한 액세스를 제어하십시오. 이 작업을 수행하는 방법은 선택한 플랫폼 및 프레임 워크에 따라 다르지만, 대부분의 경우 작업에 일부 권한이 필요한 경우 브라우저를 인증 단계로 자동 리디렉션하는 선언적 보안 모델을 지원합니다.
  2. 프로그래밍 방식의 보안을 사용하여 개체에 대한 액세스를 제어하십시오. 프레임 워크 수준에서 수행하기가 더 어렵습니다. 더 자주, 그것은 당신이 당신의 코드에 작성 해야하는 것이므로 오류가 발생하기 쉽습니다. 이 검사는 사용자에게 작업에 대한 권한이있을뿐 아니라 수정중인 특정 개체에 대한 필요한 권한이 있는지 확인함으로써 역할 기반 검사를 넘어서게됩니다. 역할 기반 시스템에서는 관리자 만 인상을 줄 수 있는지 쉽게 확인할 수 있지만 그 이상으로 직원이 특정 관리자 부서에 속해 있는지 확인해야합니다.
  3. 대부분의 데이터베이스 레코드에는 조건 1과 2로 충분합니다. 그러나 예측할 수없는 ID를 추가하는 것은 약간의 추가 보험 또는 "심층 보안"으로 생각할 수 있습니다. 그러나 예측할 수없는 식별자가 필요한 한 곳은 세션 ID 또는 다른 인증 토큰으로, ID 자체는 요청을 인증합니다. 이들은 암호화 RNG에 의해 생성되어야합니다.

27
예측할 수없는 ID를 추가하는 IMO는 "불분명 한 보안"방식이며 잘못된 보안 감각으로 이어질 수 있습니다. (1)과 (2)에 초점을 맞추고 액세스 제어가 제대로되어 있는지 확인하는 것이 좋습니다.
stucampbell

4
암호화 RNG를 사용한다고해서 "모호함을 통한 보안"은 아닙니다. 공격자는 개체 식별자를 생성하는 방법을 알고 있어도 개체 식별자를 추측하지 않아도됩니다. 모호성을 통한 보안은 사용중인 알고리즘이 발견되면이를 악용 할 수 있음을 의미합니다. 키나 RNG의 내부 상태와 같은 비밀을 유지하는 것은 아닙니다.
erickson

1
@stucampbell 아마도 그렇다고해서 예측할 수없는 ID를 전혀 사용해서는 안된다는 의미는 아닙니다. 버그가 발생하므로 예측할 수없는 ID는 추가 안전 메커니즘입니다. 또한 액세스 제어가이를 사용하는 유일한 이유는 아닙니다. 예측 가능한 ID는 특정 기간 내에 신규 고객 수와 같은 민감한 정보를 공개 할 수 있습니다. 당신은 정말로 그러한 정보를 노출하고 싶지 않습니다.
user247702

1
@Stijn 당신은 내가 얼마나 많은 고객을 노출시키기 위해“정말 원치 않는다”고 말할 수 없습니다. 맥도날드는 100 억 개의 햄버거를 먹었다는 큰 징조가 있습니다. 전혀 보안 위험이 아니며 선호 사항입니다. 또한 대부분의 응용 프로그램에서 URL이 표시되기 전에 로그인해야합니다. 따라서 우리는 누가 데이터를 긁고 있는지 알 것입니다.
Wayne Bloss

1
이 대화에서 언급하지 않은 한 가지는 문제 해결 및 사용 편의성 관점에서 사용자를 특정 리소스로 안내하거나 사용자를 유치 할 수 있도록 URL에 ID를 노출시키는 것이 매우 편리하다는 것입니다 그들이보고있는 리소스를 정확히 알려줍니다. 하나의 아이디어를 제공하기 위해 자동 증분을 더 높은 값으로 시작하면 비즈니스 인텔리전스 문제를 피할 수 있습니다.
Chockomonkey

47

데이터 보안 위험은 아니지만 데이터 크기와 속도를 모두 노출하므로 비즈니스 인텔리전스 보안 위험입니다. 나는 비즈니스가 이것에 의해 피해를 입는 것을 보았고이 반 패턴에 대해 깊이 글을 썼습니다. 실험이 아닌 사업이 아니라면 개인 신분을 공개하지 않는 것이 좋습니다. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e


4
마지막으로, 보안 위험 이외의 다른 측면을 가져 오는 정답입니다.
peceps

2
이것이 정답입니다. 공격자가 항상해야하는 보안을 우회 할 수 있다고 가정 할 경우 이러한 종류의 정보를 넘겨주고 싶지는 않습니다.
Kriil

@Kriil 보안을 우회 할 필요조차 없습니다. 그들은 단지 계정을 만들면됩니다!
피터

32

ID의 의미에 따라 다릅니다.

경쟁상의 이유로 회원 수를 공개하고 싶지 않지만 순차적 ID를 사용하면 URL에 http://some.domain.name/user?id=3933이 표시됩니다.

반면에 사용자의 로그인 이름을 대신 사용하는 경우 : http://some.domain.name/user?id=some 사용자가 아직 모르는 내용을 공개하지 않은 것입니다.


2
당신이 순차적 ID가 당신에게 맞아요을 사용하는 경우, 그러나 다음 경우 것은 아무것도 노출되지 않습니다
orip

@ orip : 내가 말했듯이, 그것은 여러 ID를 검사하여 누군가가 발견 할 수있는 것에 달려 있습니다. 패턴이 있습니까? 그들은 그 정보를 사용하여 의도하지 않은 정보를 얻을 수 있습니까?

@ 존 : 편집 주셔서 감사합니다. 영어는 모국어가 아닙니다 :)

6
나는 이것을 정확하게했다 : 순차 ID 번호를 사용하여 경쟁사의 사용자베이스의 크기를 결정했다.
Micah

3
그들은 어디에나 있습니다. 많은 쇼핑 사이트에서 주문 ID에 일련 번호를 사용합니다. 한 날짜에 한 번 주문하고 다른 날짜에 한 번 주문하면 해당 기간 동안 주문이 몇 건인지 알 수 있습니다. 주문 금액이 얼마인지 모르더라도 비즈니스가 얼마나 잘 진행되고 있는지를 여전히 알 수 있습니다.

25

일반적인 생각은 다음과 같습니다. "앱의 내부 작동에 대한 정보를 다른 사람에게 공개하지 마십시오."

데이터베이스 ID를 노출하면 일부 정보를 공개하는 것으로 간주됩니다.

그 이유는 해커가 앱 내부 작업에 대한 정보를 사용하여 공격하거나 사용자가 보지 않을 데이터베이스에 들어가도록 URL을 변경할 수 있기 때문입니다.


1
그들이 볼 수없는 리소스에 액세스-권한을 확인하지 않은 경우에만 (그렇지 않으면 다른 보안 문제가 있습니다). "내부 작업"에 관한 정보를 공개하는 것은 바로 내 질문입니다. 왜 문제입니까?
orip

8
@orip : 최대한 안전하다는 것이 전부입니다. 실수하지 않는 프로그래머라면 문제가되지 않습니다. 그렇지 않으면 더 적은 세부 정보를 노출하면 실수를 할 때 코드를 악용하기가 더 어려워집니다. 그 자체만으로는 보안이 추가되지 않습니다.
Adam Bellaire

@Adam : 피상적 보안은 보안이없는 것보다 더 나쁠 수 있습니다. 보안이 없으면 명시 적이며 피상적 보안을 통해 보안이 불가능한 것을 추가 할 수 있다고 생각할 수 있습니다.
orip

16

데이터베이스 ID에는 GUID를 사용합니다. 그것들을 새기는 것은 훨씬 덜 위험합니다.


이것이 내가 제안하는 것입니다. 데이터베이스에서 GUID를 추측 할 가능성이 훨씬 적습니다.
Jon Erickson

6
성능이 저하됩니다. 여기
Jeshurun

2
guid 사용에 대한 흥미로운 점 1은 클라이언트가 데이터베이스 ID를 생성 할 수 있다는 것입니다. 흥미로운 점 2는 자동 증분 ID와 같은 방식으로 샤딩 된 데이터베이스에 아무런 문제가 없다는 것입니다.
브라이언 화이트

이 GUID를 html 코드에서도 아이디 속성으로 사용하여 사용자, 댓글, 게시물을 식별합니까? 사용자가 클릭 한 링크 또는 댓글을 달고 싶은 게시물을 표시하려면?
trzczy

7

db에서 정수 ID를 사용하는 경우 qs 변수를 변경하여 사용자가 원하지 않는 데이터를 쉽게 볼 수 있습니다.

예를 들어 사용자는이 qs에서 id 매개 변수를 쉽게 변경하고 http : // someurl? id = 1 해서는 안되는 데이터를 보거나 수정할 수 있습니다


7
권한을 확인하지 않으면 다른 보안 문제가 있습니다.
orip

그러나 대답은 정확합니다 : "may"
Seun Osewa

1
권한을 확인하면 문제가 아닙니다. 모르는 새 직원이 권한을 확인하는 경우입니다.
브라이언 화이트

@BrianWhite-이것이 코드 검토 프로세스가 필요한 이유입니다. 따라서 프로덕션에 오기 전에 교육 할 수 있습니다.
candu

2
우리가하는 일은 URL 또는 양식 변수에 사용될 때 정수 ID를 암호화하는 것입니다.
브라이언 화이트

6

데이터베이스 ID를 클라이언트에 보내면 강제로 두 경우 모두 보안을 확인 합니다. 웹 세션에서 ID를 유지하는 경우 원하는 것을 원할 것인지 선택할 수 있습니다. 이는 잠재적으로 처리량이 적다는 것을 의미합니다.

이는), 당신은 지속적으로 액세스 제어에 일을 위임하려고 할 수 있습니다 응용 프로그램의 경우가하지만 내 전체 경력에 같은 일관된 백엔드 시스템을 본 적이 없다. 대부분은 웹 이외의 용도로 설계된 보안 모델을 가지고 있으며 일부는 사후에 추가 역할을 추가했으며 일부는 핵심 보안 모델 외부에 볼트로 고정되어 있습니다 (역할이 다른 운영 컨텍스트에 추가 되었기 때문에). 웹 전에).

따라서 우리는 합성 세션 로컬 ID를 사용합니다.

정수가 아닌 키 필드의 문제도 있으며, 이는 열거 된 값과 유사한 경우 일 수 있습니다. 해당 데이터를 삭제하려고 시도 할 수 있지만 작은 바비 드롭 테이블 처럼 될 가능성이 있습니다 .


4
흥미 롭지 만 모든 요청에 ​​대한 모든 입력 (URL 매개 변수 포함)을 확인하는 것이 웹에 매우 적합하다고 생각합니다.
orip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.