2012-03-28 2 views
5

DB 내부 ID를 URL에 표시하는 것은 나쁜 습관입니까?DB 내부 ID를 URL에 표시하는 것은 나쁜 습관입니까?

예를 들어, 각 행에 대해 일부 ID (기본 키)가있는 users 테이블이 있다고 가정합니다. 5이 실제 기본 키인 URL myapp.com/accountInfo.html?userId=5을 노출 시키면 "나쁜 것"으로 간주되며 그 이유는 무엇입니까?

또한 SQL 인젝션을 적절하게 방어한다고 가정합니다.

대부분 자바 웹 기술 스택 (자바 태그)과 관련된 답변에 관심이 있지만 일반 답변 또한 매우 유용 할 것입니다.

감사합니다.

답변

7

URL을 구문 분석하는 방식을 기반으로합니다. 블라인드 SQL 인젝션이 좋지 않은 경우. 사용자 입력에서 ID를 확인하기 만하면됩니다.

Stackexchange는 주소 표시 줄에서 볼 수있는 행의 ID를 URL에 넣습니다. 트릭은 부분을 파싱하고 모든 가능한 SQL을 얻는 것입니다. simples 방법은 ID가 숫자인지 확인하는 것입니다.

+0

예.우리가 주사를 제대로 방어한다고 가정합시다. – Simeon

+0

"사용자에게 친숙한"URL을 사용하지 않는 경우이 경우에는 문제가되지 않을 수 있습니다. – rekire

+0

정확하게 내 의견 감사합니다. – Simeon

7

URL을 통해 전달하는 것은 나쁜 일이 아닙니다. 이는 최종 사용자에게 많은 의미가 없으므로 응용 프로그램 실행에서 그 값에 의존하는 경우에만 좋지 않습니다. 예를 들어, 사용자가 userId = 5를 알아 차리고이를 userID = 10으로 변경하여 다른 사람의 계정을 표시하지 않도록 할 수 있습니다.

이 정보를 서버의 세션에 저장하는 것이 훨씬 안전합니다. 예를 들어 사용자가 로그인하면 사용자 ID 값이 서버의 세션에 저장되고 데이터베이스를 쿼리 할 때마다이 값을 사용합니다. 이런 식으로하면 일반적으로 URL에 userID를 전달할 필요가 없지만 DB 쿼리 코드에서 사용되지 않기 때문에 해를 끼치 지 않습니다.

0

URL에 데이터베이스 ID를 사용하는 것이 좋습니다.이 ID는 개체 (db 행)의 수명에서 절대로 변경해서는 안됩니다. 따라서 URL은 내구성이 있습니다. URL의 가장 중요한 요소입니다. Cool URIs don't change을 참조하십시오.

+0

유권자는 그의 의견을 설명해 주시겠습니까? – deamon

+0

이것은 매우 도움이되었습니다. 감사합니다. – Simeon

+0

매우 잘못되었습니다. 이렇게하면 데이터베이스가 변경되는 데 장애가됩니다. –

2

네, 나쁜 것입니다. 구현 세부 사항이 노출됩니다. 얼마나 나쁜지? 조건에 따라서. 사용자 입력에 대해 불필요한 검사를 수행해야합니다. 다른 응용 프로그램이 시작될 경우 더 이상 데이터베이스 스키마를 자유롭게 변경할 수 없습니다.

+0

IMO 기본 키는 프로덕션 환경에서 한번 변경 될 수 없습니다. 프로덕션 환경에 있지 않더라도 다른 테이블이 종속되어 있기 때문에 어쨌든이를 변경할 수 없습니다. 또한 일반적으로 기본 키를 변경하는 경우 얻을 수있는 이점은 없습니다. 사용자에게 (URL 네비게이션을 모두 사용하는 경우) URL을 표시하려면 일부 매개 변수가 필요하므로 * 구현 세부 사항을 * 노출해야합니다. – Simeon

+0

@ 시므온 : 물론 기본 키가 변경됩니다. 특히 데이터 모델을 재 설계 할 때. 나는 폭포 상황에서 일하지 않는다. 데이터베이스로의 매핑이 어떤 클라이언트에게 노출되어서는 안됩니다. 다른 저장 영역을 사용하고 싶을 수도 있습니다. –

0

PK는 시스템을 의미합니다.
사용자에게 다른 의미를 나타낼 수 있습니다.
예 : 다음 링크를 고려해 보겠습니다. 기본 키를 사용하여 제품 아래에 항목을 표시합니다.
productA, productB, productC;

(A)http://blahblahsite.com/browse/productA/111 (PKEY)
(B)http://blahblahsite.com/browse/productB/112 (PKEY)
(C)http://blahblahsite.com/browse/productC/113 (PKEY) 링크 느낄 수 B에
사용자 (112 개) 항목이 ProductB에서는 오해의 소지가 있습니다.

또한 PK가 자동으로 증가하므로 테이블을 병합하는 동안 문제가 발생합니다.

+0

URL이 사용자 경험의 일부라고 생각하지 않습니다. 아무도 URL을 더 이상 입력하지 않습니다. 무언가를 개발하지 않으면 나도 그에게 관심을 기울이지 않습니다. 그래서 그것이 오도하는 사실은 나에게 매우 어울리지 않는 것처럼 보입니다. 그러나 나는 자동 증가 인수에 동의합니다. – Simeon

+0

stackexchange URL을 살펴보면 DB와 관련이없는 경우 오해의 소지가있는 여러 개의 숫자도 포함되어 있습니다. – Simeon

관련 문제