티스토리 뷰



<connstr>server=localhost;database=testdb;port=33000;user=public;password=pubpub</connstr>

<connstr>server=127.0.0.1;user id=root; password=wservice; database=mysql; pooling=false</connstr>

<connstr>User=workuser; Password=pw!@;Database=c:\tmp\mydb.fdb;DataSource=localhost;Port=3050;</connstr>

<connstr>Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=system;Password=SYSPASS;</connstr>

<connstr>Server=myServerName\myInstanceName;Database=myDataBase;User Id=myUsername;Password=myPassword;</connstr>

<connstr>Server=127.0.0.1;Database=donghmi;Trusted_Connection=True;</connstr>



하나의 응용 프로그램에서 다양한 데이터베이스 연결을 지원하는 경우 위의 예제와 같은 데이터베이스별 연결 스트링을 사용하게 됩니다. 개발자에 따라서 연결 스트링은 정말 다양한 형태를 가질 수 있습니다. 그런데 시스템 확인 등의 필요에 따라서 연결 스트링을 화면에 출력하는 경우 연결 스트링에 있는 연결 비밀번호까지 보여 주는 것은 보안상 문제가 있을 수도 있습니다.  그래서 연결 스트링에 대문자, 소문자 상관없이 "passsword=mypassword"로 형태로 입력되어 있다면 비밀번호를 ***로 표시하고자 합니다.


이러한 사례는 카드 번호나 전화 번호 일부를 숨기는 경우 등에도 적용할 수 있습니다. 문자열 중에 카드번호나 전화번호가 불규칙한 위치에 포함되는 경우, 카드 번호나 전화 번호 형태의 문자열을 찾아서 첫번째 대시(-)와 두번째 대시(-) 사이를 ***로 표시하는 경우도 마찬가지인데 이런 필요가 있는 경우 정규식 클래스를 사용하면 간편하게 해결 할 수 있습니다.


using System.Text.RegularExpressions;

static string linkMatchEvaluatorMethod(Match match)
{
	int idx = match.Value.IndexOf('=');
	if (idx < 8) return "";
	return match.Value.Substring(0, idx) + "=***";
}

public string adjust_constr(string constr)
{
	return Regex.Replace(constr, @"password[ ]*=([^;]+|[^<]+)", linkMatchEvaluatorMethod, RegexOptions.IgnoreCase);
}


위의 예제에서 사용한 Regex.Replace()는 첫번째 인수로 원본 스트링(constr)받아 두번째 인수로 지정한 검색 패턴을 찾고 해당 문자열이 찾아지면 세번째 인수로 지정한 사용자 함수를 호출해서 문자열 변경 작업을 수행하고 변경분을 감안한 최종 문자열을 리턴합니다. 네번째 인수로 지정한 RegexOptions.IgnoreCase는 대문자, 소문자 상관없이 검색하라는 옵션입니다. 이 옵션을 지정하면 "password="과 "Password="를 모두 검색합니다.


검색 패턴에 대해서는 정규식에 대한 스터디가 필요하기는 한데 위에서 사용한 내용을 풀어 보면 아래와 같습니다.

        • password[ ]*=
          passsword와 =사이에 0개 이상의 공백 문자가 있으면 일치. 

        • ( A | B )
          A조건을 만족하거나 B조건을 만족.

        • [^;]+ 
          세미콜론(;)이 아닌 1개 이상의 문자

        • [^<]+
          부등호 문자(<)가 아닌 1개 이상의 문자


요즘 개발자들이 사용하는 대부분의 통합 개발 환경이나 텍스트 편집기에서는 정규식 검색이나 치환을 지원하기 때문에 정규식을 조금만 사용할 수 있어도 무식한 반복 작업을 한번의 명령으로 끝낼 수 있습니다.




댓글
댓글쓰기 폼