2013-03-07 5 views
7

먼저이 질문은 교육적 질문입니다. C#의 기본 사항을 배우기 때문에 프로덕션 응용 프로그램에서 구현하는 것이 아닙니다.SQL 자격 증명을 올바르게 저장합니다.

현재 2 개 (실제로는 3 개, 하나는 단위 테스트 용)의 프로젝트가 포함되어 있습니다.

  • 양식 클래스 라이브러리 내부
  • 클래스 라이브러리

나는 Database.cs라는 클래스를 가지고 있고 그것은 MySQL 데이터베이스와 통신합니다. 나는이 Database.cs 클래스와 직접 통신하지 않지만 클래스 라이브러리 안에있는 다른 클래스들 (예 : Products.cs)을 사용합니다. 비록이 MySQL 데이터베이스에 연결할 수있는 자격 증명이 필요하며 안전하게 할 수있는 방법이 확실하지 않습니다.

클래스 라이브러리 내에 저장/클래스 내에 자격 증명을 하드 코딩합니다.

사용자가 쉽게 DLL을 가져올 수 있고 기술적으로 데이터베이스에 자격 증명이 있기 때문에 이것은 나에게 이해가되지 않습니다.

은 (Products.cs 같은) 클래스에 형태를 통해 자격 증명을 전달하고

작동 할 수 데이터베이스 객체를 초기화하는 동안 그 클래스에 전달합니다, 시도하고 그것은 작동하지만이이 인 경우 확실하지 않다 '가장 깔끔한'방법. 내가 처음으로 예를 들어 내가 같은 떨어져 거의 오전 클래스 라이브러리 내부의이 정적 클래스를 만드는 경우

는 다시 자격 증명

와 속성이 모두 포함 된 정적 클래스를 작성한다. Form 안에이 정적 클래스를 만들면 클래스 라이브러리에서 양식 프로젝트에 대한 참조를 추가해야합니다 (원하는 방식이 아님).

나는 물건을 찾으려고 노력했다. 그러나 나는 명백하게 그것을 올바르게하지 않고있다. 이것을 할 수있는 다른 방법이 있습니까?

+0

나는 당신의 제목을 편집했다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+0

@JohnSaunders SQL 역시 태그입니다. – bas

+1

@bas :이 경우에는 형용사로 사용됩니다. 어떤 자격증 명인가? ** SQL ** 자격 증명. –

답변

4

우선 자격 증명이 코드에 하드 코드되지 않습니다. 자격 증명이 시간이 지남에 따라 변경되는 경향이 있으므로 SQL 자격 증명이 변경 될 때마다 응용 프로그램을 다시 컴파일하고 다시 배포해야하기 때문입니다.

일반적으로 데이터베이스에 연결하는 데 필요한 모든 정보는 connection string 형태로 응용 프로그램 구성 파일에 저장됩니다.

응용 프로그램이 웹 응용 프로그램 인 경우 web.config (웹 응용 프로그램 구성 파일)가 웹 서버에 저장되고 웹 요청에 제공되지 않기 때문에 갈 수 있습니다. 그러나 응용 프로그램이 Windows Forms 응용 프로그램 인 경우 보안 고려 사항은 응용 프로그램을 사용하는 모든 사용자가 응용 프로그램 구성 파일을 엿보고 자격 증명을 얻을 수 있음을 의미합니다. Microsoft SQL이라면 Windows 인증을 사용하는 것이 좋습니다. 하지만 MySQL을 사용하면 연결 문자열에 사용자 이름과 암호를 저장해야 할 것입니다. 그런 다음 encrypting하여 연결 문자열을 확보하는 것이 좋습니다.
의 app.config : 사용자가/(MySQL의 사용자 이름과 암호를 입력) MySQL 서버에 대한 인증을 할 수 있습니다 또한 경우

, 당신은 연결 문자열 템플릿과 사용자 이름 및 암호와 그것의 대체 특정 부분을 사용할 수 있습니다

<connectionStrings> 
    <add name="MyApplication" connectionString="Location=myServerAddress;Data Source=myDataBase;User ID={0};Password={1}; 
Port=3306;Extended Properties=""""; /> 
    </connectionStrings> 

C# 코드

var username = textboxUsername.Text; 
var password = textboxPassword.Text; 

var connectionString = string.Format(ConfigurationManager.ConnectionStrings["MyApplication"].ConnectionString, username, password) 
// at this point you have a connection string whitch could be passed to your Products class 
1

는 번째로 자격 증명을 하드 코딩하지 마십시오 at은 문제를 일으킬 수 있습니다. 첫째, 나중 단계에서 로그인 자격 증명을 데이터베이스로 변경해야하는 경우 클래스 라이브러리를 다시 컴파일해야합니다. 둘째, 보안이 손상 될 것이라고 언급합니다.

연결 정보를 데이터 영역에 저장하는 대신 주 응용 프로그램에 남겨 두는 것이 좋습니다. 런타임 중에 연결 문자열을 수락하도록 데이터 계층을 리 팩터하면이 값을 주 응용 프로그램에서 데이터 액세스 계층으로 전달해야합니다. 당신이 당신의 응용 프로그램을 배포

  1. 가 배포 된 위치 당신은 그래서 당신의 구성 파일에 연결 문자열을 암호화 할 수 있습니다
  2. 개발 환경과는 다른 연결 자격 증명을 가질 수

    이 방법 당신은이 장점을 얻을 보안을 강화하기 위해

관련 문제